数据结构 第5章 矩阵和广义表.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文档。上传文档
查看更多
表结点 原子结点 (2)孩子兄弟表示法 表结点,用以表示列表;原子结点,用以表示原子。在表结点中包括一个指向第一个孩子(长子)的指针hp和一个指向兄弟的指针tp;而在原子结点中包括一个指向兄弟的指针tp和该原子的值域。为了能区分这两类结点,在结点中还要设置一个标志域。如果标志为1,则表示该结点为有孩子结点;如果标志为0,则表示该结点为无孩子结点。 3.广义表的基本算法 (1)求广义表的深度 广义表的深度定义为广义表中括弧的重数,是广义表的一种量度。设非空广义表为: LS=(a1, a2,…, an) 其中ai(i=1,2,…,n)或为原子或为LS的子表,则求LS的深度可分解为n个子问题,每个子问题为求ai的深度,若ai为原子,则由定义其深度为零,若ai为广义表,则和上述一样处理,而LS的深度为各ai(i=1,2,…,n)的深度中最大值加1。空表也是广义表,并且空表的深度为1。 由此可见,求广义表深度的递归算法有两各终结状态:空表和原子,只要求得ai(i=1,2,…,n)的深度,广义表的深度为子表深度的最大值加1。 广义表的深度DEPTH(LS)的递归定义: DEPTH(LS)=1 当LS为空表时 DEPTH(LS)=0 当LS为原子时 DEPTH(LS)=1+MAX{DEPTH(ai)} n≥1 int GlistDepth( Glist *h) { int max,dep; Glist *pre; if (h= =null) return 1; /*递归出口,空表深度为1*/ if (h-tag= =0) return 0; /*递归出口,原子元素深度为0*/ pre=h; for (max=0;pre!=Null; pre=pre-content.tp) { dep=GlistDepth(pre-content.hp); /*递归求表头的深度*/ if (depmax) max=dep /*在广义表的一层中寻找深度最大值*/ } return max+1; } 广义表D=(A, B, C)=(( ), (e), (a, (b, c, d)))的深度为3。按递归定义分析广义表D的深度,则有: DEPTH(D)=1+MAX{DEPTH(A),DEPTH(B), DEPTH(C)} DEPTH(A)=1; DEPTH(B)=1+MAX{DEPTH(e)}=1+0=1 DEPTH(C)=1+MAX{DEPTH(a), DEPTH((b, c, d))}=2 DEPTH(a)=0 DEPTH((b, c, d))=1+MAX{DEPTH(b), DEPTH(c), DEPTH(d)}=1+0=1 因此,DEPTH(D)=1+MAX{1, 1, 2}=3。 3.广义表的基本算法 (2)复制广义表 复制一个广义表只要分别复制其表头和表尾即可。而广义表的表头和表尾仍可能是一个广义表,所以复制广义表算法是一个递归算法。 Glist *lcopy(Glist *la) { Glist *p; if (la= =NULL) return NULL; /*广义表为空*/ p=(Glist *)malloc(sizeof(Glist)); p-tag=la-tag; /*复制tag域*/ if (p-tag= =0) /*为原子结点*/ p-val.data=la-val.data; /*直接复制data域*/ else { p-val.sublist.hp=lcopy(la-val.sublist.hp) ; /*复制表头*/ p-val.sublist.tp=lcopy(la-val.sublist.tp); /*复制表尾*/ } return p; } 递归函数 1、对于含有递归特性的问题,最好设计递归形式的算法。但也不要单纯追求形式,应在算法设计的分析过程中“就事论事”。例如,在利用分割求解设计算法时,子问题和原问题的性质相同;或者,问题的当前一步解决之后,余下的问题和原问题性质相同,则自然导致递归求解。 2、实现递归函数,目前必须利用“栈”。一个递归函数必定能改写为利用栈实现的非递归函数;反之,一个用栈实现的非递归函数可以改写为递归函数。需要注意的是递归函数递归层次的深度决定

文档评论(0)

好文精选 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档