广义表的定义与实现.ppt

  1. 1、本文档共33页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
广义表的定义与实现

第5章 广义表 5.1 广义表的定义 5.2 广义表操作的实现 5.1 广义表的定义 5.1.1 定义 广义表(Lists)简称表,它是线性表的推广。 一个广义表是n(n≥0)个元素的序列,当n=0时称为空表。在一个非空的广义表中,其元素可以是某一确定类型的对象(这种元素被称作单元素),也可以是由单元素构成的表(这种元素可相对地被称作子表或表元素)。显然,广义表的定义是递归的,广义表是一种递归的数据结构。 设ai为广义表的第i个元素,广义表LS可表示为: LS=(a1,a2,…, an) 其中: ①LS——广义表的名字; ②n——广义表的长度; ③ ; ④n=0 空表; ⑤当广义表非空时,称a1为表头(head),其余元素组成的表(a2,a3, …, an)为表尾(tail); 广义表的抽象数据类型:P107 5.1.2 举例 分别用圆圈和方框表示表(表元素)和单元素 ①A=() 空表,其长度为零。 ②B=(e) B中只有一个单元素,长度为1,表头为e,表尾为空。 ③C=(a,(b,c,d)) 长度为2,表头为‘a’,表尾为子表((b,c,d))。 ④D=(A,B,C) 长度为3,表头为A, 表尾为(B,C)。 ⑤E=(a,E) 长度为2,表头为a,表尾为(E)--表头为E,表尾为()。E相当于无穷表(a,(a,(a,(…))))。 5.1.3广义表的几个性质 ①有次序性: 广义表中的数据元素有固定的相对次序。 线性排列 --线性表的推广 层次结构 --树的推广 ②有长度: 广义表的长度定义为最外层括弧中包含的数据元素个数。 表元素个数一定,不能无限,可以是空表。 ③有深度: 广义表的深度(多少层)定义为广义表书写形式中括弧的最大重数,因此空表的深度为1,因为一个单原子不是广义表,所以没有深度可言,但可以认为它的深度为0。 如:A,B:1;C:2;D:3; E:无穷大。 ④可递归: 如E。 ⑤可共享: 子表可共享。 5.1.4 广义表的存储结构 由于广义表中的数据元素可以是原子,也可以是广义表,显然难以用顺序存储结构表示。 由于列表中的数据元素可能为原子或列表,由此需要两种结构的结点:一种是表结点,用以表示列表;一种是原子结点,用以表示原子。 为了在存储结构中便于分辩原子和子表,令表示广义表的链表中的结点为异构结点,如图所示, 结点中设有一个标志域tag, 并约定 tag=0 表示原子结点,tag=1 表示表结点。原子结点中的 data 域存储原子,表结点中指针域的两个值分别指向表头和表尾。 广义表的头尾链表存储表示: enum ElemTag {ATOM,LIST}; typedef char AtomType; struct GLNode{ ElemTag tag; union { AtomType atom; struct { GLNode *hp,*tp; } ptr; }; }; typedef GLNode* GList; 例:广义表 L=(a,(x,y),((z))) 的存储结构。 可由对L进行表头和表尾的分析得到--若列表不空,则可分解成表头和表尾(采用头尾链表存储结构)。 分析: ①L为一非空列表 ②L的表头为原子a ③L的表尾为列表((x,y),((z))) ④((x,y),((z)))的表头为列表(x,y) 其余分析同上。 5.2 广义表操作的实现 基于广义表是递归定义的结构,因此实现广义表操作的算法均为递归函数。 5.2.1 分治法与递归求解 分治法是进行算法设计的一种方法,其严格定义为: 对于一个输入规模为 n 的函数或问题,用某种方法把输入分割成 k(1k≤n) 个子集,从而产生m个子问题,分别求解这m个问题,得出m个问题的子解,再用某种方法把它们组合成原来问题的解。若子问题还相当大,则可以反复使用分治法,直至最后所分得的子问题足够小,以至可以直接求解为止。 在利用分治法求解时,若所得子问题的性质和原问题相同,则可递归求解。 何谓递归函数? 一个含直接或间接调用本函数语句的函数被称之为递归函数,它必须满足以下两个条件: ①在每一次调用自己时,必须是(在某种意义上)更接近于解; ②函数中必须有一个终止处理或计算的准则。 5.2.2 广义表的头尾链表存储表示 glist.h #include iostream #include string using namespace std; enum ElemTag {ATOM,LIST}; typedef char

文档评论(0)

wyjy + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档