第五章数组和广义表.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文档。上传文档
查看更多
数据结构 第五章 数组和广义表 5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储 5.3.1 特殊矩阵 5.3.2 稀疏矩阵 5.4 广义表的定义 5.5 广义表的存储结构 推广:已知n维数组每维长度分别为b1,b2,…bn.,每个元素占L个存储单元,则: LOC( j1,j2…,jn ) =LOC(0,0,…0)+(b2*b3*…*bn*j1+b3*…*bn*j2+…+bn*jn-1+jn)*L =LOC(0,0,…0)+(c1*j1+c2*j2+…cn-1*jn-1+cn*jn) 其中: cn=L,ci-1=bi*ci , 2=i=n 3 十字链表  当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表,而应采用链式存储结构的十字链表。 typedef struct OLNode{ int i,j; //该非零元的行和列下标 ElemType e; //该非零元的值 struct OLNode *right, *down; //行和列的后继 }OLNode; *OLink; typedef struct{ OLink *rhead, *chead; //行和列的指针向量基址 int mu, nu, tu;//矩阵的行数、列数和非零元个数 }CrossList; 算法5.4是建立十字链表的算法。 矩阵加法与多项式加法相似,回去自己看。 通常用圆括号将广义表括起来,用逗号分隔其中的元素。为了区别原子和广义表,书写时用大写字母表示广义表,用小写字母表示原子。若广义表LS(n=1)非空,则a1是LS的表头,其余元素组成的表(a2,…an)称为LS的表尾。 显然广义表是递归定义的,因为在定义广义表时又用到了广义表的概念。广义表的例子如下: (1)A=()—A是一个空表,其长度为零。 (2)B=(e)—表B只有一个原子e,B的长度为1。 (3)C=(a,(b,c,d))——表C的长度为2,两个元素分别 为原子a和子表(b,c,d)。 (4)D=(A,B,C)——表D的长度为3,三个元素A,B,C都是广义表。显然,将子表的值代入后,则有D=(( ),(e),(a,(b,c,d)))。 (5)E=(a, E)——这是一个递归的表,它的长度为2,E相当于一个无限的广义表E=(a,(a,(a,(a,…)))). 从上述定义和例子可推出广义表的三个性质: 广义表的元素可以是子表,而子表的元素还可以是子表。由此,广义表是一个多层次的结构,可以用图形象地表示。P108 广义表可为其它表所共享。例如在上述例(4)中,广义表A,B,C为D的子表,则在D中可以不必列出子表的值,而是通过子表的名称来引用。 广义表可以是一个递归的表,如例(5)。 由表头、表尾的定义可知:任何一个非空广义表其表头可能是广义表,也可能是广义表,而其表尾必定是广义表。 对于B=(e) GetHead(B)=e, GetTail(B)=() 对于D=(A,B,C) GetHead(D)=A, GetTail(D)=(B,C) 由于(B,C)为非空广义表,则可继续分解得到: GetHead(B,C)=B GetTail(B,C)=(C) 注意广义表( )和( ( ) )不同。前者是长度为0的空表,对其不能做求表头的和表尾的运算;而后者是长度为1的非空表(只不过该表中唯一的一个元素是空表)。对其可进行分解,得到表头和表尾均为空表( )。 5.5 广义表的存储结构 由于广义表(a1,a2,a3,…an)中的数据元素可以具有不同的结构(或是原子,或是广义表),因此,难以用顺序存储结构表示,通常采用链式存储结构,每个数据元素可用一个结点表示。 由于广义表中有两种数据元素,原子或广义表,因此,需要两种结构的结点:一种是表结点,一种是原子结点。 下面介绍两种广义表的链式存储结构。 1、表结点由三个域组成:标志域、指示表头的指针域和指示表尾的指针域;而原子域只需两个域:标志域和值域。 表结点 原子结点 广义表的头尾链表存储表示 typedef enum{ATOM, LIST} ElemTag;//ATOM==0表示原子,LIST==1表示子表 typedef struct GLNode{ ElemTag tag; union{ AtomType atom; struct {struct GLNode *hp, *tp;} ptr; //ptr是表结点的指针域,ptr.hp和ptr.tp

文档评论(0)

136****1820 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档