第五章 数组和广义表.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章数组和广义表整理

习惯上,用大写字母表示广义表的名称,小写字母表示原子 矩阵B加到矩阵A上的运算 假设两个矩阵相加后的结果为A’,则和矩阵A’中的非零元aij’只能有三种情况.或者是bij(aij=0时);或者是aij(bij=0时);或者是aij+bij;由此,当将B加到A上去时,对A矩阵的十字链表来说,或者插入一个新的结点,或者不变,或者是改变结点的val域值.还有一种可能,和矩阵A中的某个非零元相对应,和矩阵A’中是零元,即对A的操作是删除一个结点(aij+bij =0).由此,整个运算过程可从矩阵的第一行起逐行进行.对每一行都从行表头出发分别A和B在该行中的第一个非零元结点后开始比较,按上述4种情况分别处理. 假设非空指针 pa和 pb分别指向矩阵A和B中行值相同的两个结点,pa == NULL 表明矩阵A在该行中没有非零元,则上述四种情况的处理过程为: 1)若pa==NULL或pa-j pb-j,则需要在A矩阵的链表中插入一个值为bij的结点。此时,需改变同一行中前一结点的right域值,以及同一列中前一结点的down域值。 2) 若pa-j pb-j,则只要将pa指针往右推进一步。 3) 若pa-j == pb-j且pa-e+pb-e !=0,则只要将ai,j+bi,j 的值送到pa所指结点的e域即可,其它所有域的值都不变。 4) 若pa-j == pb-j且pa-e+pb-e == 0,则需要在A矩阵的链表中删除pa所指的结点。此时,需改变同一行中前一结点的right域值,以及同一列中前一结点的down域值。 为了便于插入和删除结点,还需要设立一些辅助指针。其一是,在A的行链表上设pre指针,指示pa所指结点的前驱结点;其二是,在A的每一列的链表上设一个指针hl[j],它的初值和列链表的头指针相同,即hl[j]=chead[j]。 bij(aij=0) aij(bij=0) (1)初始,令pa和pb分别指向A和B的第一行的第一个非零元素的结点,即pa=A.rhead[1];pb=B.rhead[1];pre=NULL; 且令hl初始化for(j=1;j=A.nu;++j) hl[j]=A.chead[j]; (2)重复本步骤,依次处理本行结点,直到B的本行中无非零元素的结点,即pb==NULL为止; 1)若pa==NULL或pa-jpb-j(即A的这一行中非零元素已经处理完),则需在A中插入一个pb所指结点的复制结点.假设新结点的地址为p,则A的行表中的指针如下变化: if(pre==NULL) A.rhead[p-i]=p; else{pre-right=p;} p-right=pa; pre=p; A的列链表中的指针也要做相应的改变.首先需从hl[p-j]开始找到新结点在同一列中的前驱结点,并让hl[p-j]指向它,然后在列链表中插入新结点: if(A.chead[p-j]==NULL) {A.chead[p-j]=p; p-down=NULL;} else {p-down=hl[p-j]-down;hl[p-j]-down=p;} hl[p-j]=p; 2)若pa!=NULL且pa-jpb-j,则令pa指向本行下一个非零元结点,即pre=pa;pa=pa-right; 3)若pa-j==pb-j, 则将B中当前结点的值加到A中当前结点上,即pa-e+=pb-e; 若pa-e!=0,则指针不变; 4)若pa-j==pb-j, pa-e+=pb-e; pa-e=0,则删除A中该结点,即行表中指针变为 if(pre==NULL) A.rhead[pa-i]=pa-right; else {pre-right=pa-right;} P=pa; pa=pa-right; 同时,为了改变列表中的指针,需要先找到同一列中的前驱结点,且让hl[pa-j]指向该结点,然后如下修改相应指针: if(A.chead[p-j]==p) A.chead[p-j]=hl[p-j]=p-down; else{hl[p-j]-down=p-down;} free(p); (3) 若本行不是最后一行,则令pa和pb指向下一行的第一个非零元结点,转(2);否则结束. 假设 m 行 n 列的矩阵含 t 个非零元素,令 则称 为稀疏因子。 通常认为 ? ? 0.05 的矩阵为稀疏矩阵。 稀疏矩阵:非零元较零元少,且分布没有一定规律 5.3.2 稀疏矩阵 稀疏矩阵的压缩存储方法: 一、三元组顺序表 二、行逻辑链接的顺序表 三、十字链表 #define MAXSIZE 12500 //非零元个数最大值 typedef struct { int i, j;

文档评论(0)

chenchena + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档