- 1、本文档共51页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 数组和广义表 1 数组 2 数组的存储结构 3 特殊矩阵及其压缩存储 4 稀疏矩阵 5 广义表 本章学习导读 本章主要介绍数组的概念及在计算机中的存放,特殊矩阵的压缩存储及相应运算,广义表的概念和存储结构及其相关运算的实现。通过本章学习,要求掌握如下内容: 1.数组的定义及在计算机中的存储表示; 2.对称矩阵、三角矩阵、对角矩阵等特殊矩阵在计算机中的压缩存储表示及地址计算公式; 3.稀疏矩阵的三元组表示及转置算法实现; 4.稀疏矩阵的十字链表表示及相加算法实现; 5.广义表存储结构表示及基本运算。 void main() { struct sparmatrix a; int i; /*输入稀疏矩阵的行、列数及非零元的个数*/ scanf(%d%d%d,a.rows,a.cols,a.terms); /*输入转置前的三元组*/ for( i=0;ia.terms;i++) scanf(%d%d%d,a.data[i].i,a.data[i].j,a.data[i].v); /*输出转置前的三元组*/ for(i=0;ia.terms;i++) printf(%d\t%d\t%d\n,a.data[i].i,a.data[i].j,a.data[i].v); /*调用快速转置算法*/ fastrans(a); } 该算法比按列转置多用了辅助向量空间pot,但它的时间为四个单循环,故总的时间复杂度为O(a.cols+a.terms),比按列转置算法效率要高。 2.稀疏矩阵的相加运算 当稀疏矩阵用三元组表进行相加时,有可能出现非零元素的位置变动,这时候,不宜采用三元组表作存储结构,而应该采用十字链表较方便。 (1)十字链表的建立 下面分两步讨论十字链表的建立算法: 第一步,建立表头的循环链表: 依次输入矩阵的行、列数和非零元素个数:m,n和t。由于行、列链表共享一组表头结点,因此,表头结点的个数应该是矩阵中行、列数中较大的一个。假设用s 表示个数,即s=max(m,n)。依次建立总表头结点(由hm指针指向)和s个行、列表头结点,并使用next域使s+1个头结点组成一个循环链表,总表头结点的行、列域分别为稀疏矩阵的行、列数目,s个表头结点的行列域分别为0。并且开始时,每一个行、列链表均是一个空的循环链表,即s个行、列表头结点中的行、列指针域rptr和cptr均指向头结点本身。 第二步,生成表中结点: 依次输入t个非零元素的三元组(i,j,v),生成一个结点,并将它插入到第i行链表和第j列链表中的正确位置上,使第i个行链表和第j个列链表变成一个非空的循环链表。 在十字链表的建立算法中,建表头结点,时间复杂度为O(s),插入t个非零元结点到相应的行、列链表的时间复杂度为O(t*s),故算法的总的时间复杂度为O(t*s)。 (2)用十字链表实现稀疏矩阵相加运算 假设原来有两个稀疏矩阵A和B,如何实现运算A=A+B呢?假设原来A和B都用十字链表作存储结构,现要求将B中结点合并到A中,合并后的结果有三种可能:1)结果为aij+bij;2)aij(bij=0);3)bij(aij=0)。由此可知当将B加到A中去时,对A矩阵的十字链表来说,或者是改变结点的v域值(aij+bij≠0),或者不变(bij=0),或者插入一个新结点(aij=0),还可能是删除一个结点(aij+bij=0)。 于是整个运算过程可以从矩阵的第一行起逐行进行。对每一行都从行表头出发分别找到A和B在该行中的第一个非零元结点后开始比较,然后按上述四种不同情况分别处理之。若pa和pb分别指向A和B的十字链表中行值相同的两个结点,则4种情况描述为: 1)pa-j=pb-j 且pa-k.v+pb-k.v≠0,则只要将aij+bij的值送到 pa所指结点的值域中即可,其他所有域的值都不变化。 2)pa-j=pb-j且pa-k.v+pb-k.v=0,则需要在A矩阵的链表中删除pa所指的结点。这时,需改变同一行中前一结点的rptr域值,以及同一列中前一结点的cptr域值。 3)pa-jpb-j且pa-j≠0,则只要将pa指针往右推进一步,并重新加以比较即可。 4)pa-jpb-j或 pa-j=0,则需在A矩阵的链表中插入pb所指结点。 下面将对矩阵B加到矩阵A上面的操作过程大致描述如下: 设ha和hb分别为表示矩阵A和B的十字链表的总表头;ca和cb分别为指向A和B的行链表的表头结点,其初始状态为:ca=ha-k.next ; cb=hb-k.next; pa和pb分别为指向A和B的链表中结点的指针。开始时, pa=ca-rptr; pb=cb-rptr; 然后按下列步骤执行: ①当ca
您可能关注的文档
- 第二章__车企业的战略规划和营销管理.ppt
- 第二章 金资产I:货币资金.ppt
- 第二章 第节___企业的经济效益.ppt
- 第二章中国济体制的演变.ppt
- 第二章传统案管理.ppt
- 第二章企业建_企业管理学.ppt
- 第二章__前儿童心理发展年龄特征.ppt
- 第二章市场公共财政.ppt
- 第二章 地环境与国际贸易.ppt
- 第二章推销员的基本素质.ppt
- 2024年云阳县公务员考试行测试卷历年真题及答案详解(有一套).docx
- 2024年垫江县公务员考试行测试卷历年真题及答案详解(名师系列).docx
- 2024年巴音郭楞蒙古自治州公务员考试行测试卷历年真题精选答案详解.docx
- 2024年毕节地区公务员考试行测试卷历年真题含答案详解.docx
- 2024年怀化市公务员考试行测真题及一套完整答案详解.docx
- 2023年龙岩市公务员考试行测试卷历年真题及答案详解(名校卷).docx
- 2024年咸宁市公务员考试行测试卷历年真题及完整答案详解.docx
- 2024年云浮市公务员考试行测试卷历年真题带答案详解.docx
- 2024年七台河市公务员考试行测试卷历年真题及答案详解(典优).docx
- 2024年大理州公务员考试行测真题及答案详解(全优).docx
文档评论(0)