- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章 参考
数 据 结 构 第五章 数组和广义表 5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储 5.4 广义表的定义 5.5 广义表的存储结构 5.1 数组的定义 数组是我们非常熟悉的一种数据结构,它可以看作是线性表的推广,其特点是线性表中的数据元素本身又是一个线性表。 数组的基本操作: 5.2 数组的顺序表示和实现 组成数组结构的元素可以说多维的,但存储数据元素的内存单元的地址却是一维的,因此在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。即用一组连续地存储单元存放数据元素时就有个次序约定问题。 通常,有两种顺序存储方式:行优先存储和列优先存储。 (1)行优先存储的规律:在标识数组元素各维的下标中,最右边的下标先变化,从右向左,最后变化最左边的下标。例如: (2)列优先存储的规律:在标识数组元素各维的下标中,最左边的下标先变化,从左向右,最后变化最右边的下标。例如: 练习:写出三维数组Ammp的行优先存储顺序和列优先存储顺序。 对于数组一旦规定了它的维数和各维的长度,便可以为它分配存储空间。反之,只要给出一组下标便可以求得相应数组元素的存储位置。 例如,二维数组Amn以行优先顺序存储在内存中,设数组的起始地址为LOC(a00),每一个元素占d个存储单元,那么aij的存储地址是什么? LOC(aij)= LOC(a00)+(i*n+j)*d 5.3 矩阵的压缩存储 一、特殊矩阵 1.对称矩阵 对于对称矩阵,我们可以为每一对对称元素分配一个存储空间,那么对于一个n阶对称矩阵A我们可以将其n2个元素压缩存储到多少个存储单元中? 假设以一维数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,则sa[k]和矩阵元素aij的关系是什么? n阶对称矩阵A的压缩存储结构: 2.三角矩阵 如果三角矩阵中的重复元素c共享一个存储空间,压缩存储一个n阶的三角矩阵需要使用多少存储单元? 假设以一维数组sa[n(n+1)/2]作为n阶下三角矩阵A的存储结构,则sa[k]和矩阵元素aij的关系是什么? 假设以一维数组sa[n(n+1)/2]作为n阶上三角矩阵A的存储结构,则sa[k]和矩阵元素aij的关系是什么? 二、稀疏矩阵 如何进行稀疏矩阵的压缩存储? 三元组表 三元组表中的每一个元素都是一个三元组(i,j,aij),其中i表示非零元素所在的行数,j表示非零元素所在的列数,aij表示非零元素的值。 例如,矩阵M的三元组表 三元组顺序表 假设以顺序存储结构来表示三元组表,则可以得到稀疏矩阵的一种压缩存储方式,我们称之为三元组顺序表。 三元组顺序表的类型描述 #define maxsize 1024 typedef struct{ int i,j; ElemType e; }Triple; typedef struct{ Triple data[maxsize+1]; int mu,nu,tu; }TSMatrix; TSMatrix A; A.mu=6 A.nu=7 A.tu=8 矩阵的转置运算(三元组顺序表的应用) 假设a和b是TSMatrix型变量,分别表示矩阵M和T。那么,如何由a得到b呢? 需要扫描的趟数:b.mu 每趟需要扫描的元素个数:b.tu 算法实现: TSMatrix transpose(TSMatrix a){ /*采用三元组表存储表示,求稀疏矩阵a的转置矩阵b*/ TSMatrix b; int col,p,q; b.mu=a.nu;b.nu=a.mu;b.tu=a.tu;/*矩阵的行、列、非零元素个数*/ if(b.tu){ /*有非零元素则转换*/ q=1; for(col=0; cola.nu;++col) /*按a的列序顺序扫描*/ for(p=1;p=a.tu;++p) if(a.data[p].j==col){ b.data[q].i=a.data[p].j; b.data[q].j=a.data[p].i; b.data[q].e=a.data[p].e; ++q;} } return(b); } 能否在一次扫描a之后就得到转置后的b呢? 需要解决的问题 a.data中的每一个元素在b.data中的位置。 为了确定这些位置,在转置前,应先求得M的每一列中非零元的个数,进而求得每一列的第一个非零元在b.data中应有的位置。 b.mu=a.nu;b.nu=a.mu;b.tu
文档评论(0)