- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
零基础学数据结构 8章 广义表
第8章 广义表
广义表是线性表的推广,也是一种扩展的线性数据结构。广义表被广泛应用于人工智能等领域的表处理语言Lisp中,在lisp中,广义表作为一种基本的数据结构,就连程序也表示为一系列的广义表。本章主要给大家介绍广义表的定义、广义表的顺序存储与实现、广义表的递归算法。
本章重点:
1、广义表的头尾链表表示与算法实现
2、广义表的扩展线性链表表示与算法实现
8.1 广义表
8.1.1 什么是广义表
广义表,也称为列表(lists),是由n个类型相同的数据元素(a1,a2,a3,…,an)组成的有限序列。其中,广义表中的元素ai可以是单个元素,也可以是一个广义表。
通常,广义表记作:GL=(a1,a2,a3,…,an)。其中,GL是广义表的名字, n是广义表的长度。如果广义表中的ai是单个元素,则称ai是原子。如果广义表中的ai是一个广义表,则称ai是广义表的子表。
习惯上用大写字母表示广义表的名字,用小写字母表示原子。
8.1 广义表
在广义表GL中,a1称为广义表GL的表头(head),其余元素组成的表(a2,a3,…,an)称为广义表GL的表尾(tail)。广义表是一个递归的定义,因为在描述广义表时又用到了广义表的概念。下面是一些广义表的例子。
(1)A=(),广义表A是长度为0的空表。
(2)B=(a),B是一个长度为1且元素为原子的广义表(其实就是前面讨论过的一般的线性表)。
(3)C=(a,(b,c)),C是长度为2的广义表。其中,第1个元素是原子a,第2个元素是一个子表(b,c)。
(4)D=(A,B,C),D是一个长度为3的广义表,这3个元素都是子表,第1个元素是一个空表A。
(5)E=(a,b,E),E是一个长度为3的递归广义表,相当于 E=(a,b,(a,b,(a,b,(a,b,(a,b…)))。
8.1 广义表
从上述定义和例子可推出广义表的重要结论如下:
(1)广义表的元素既可以是原子,也可以是子表,子表的元素可以是元素,也可以是子表。广义表的结构是一个多层次的结构。
(2)一个广义表还可以是另一个广义表的元素。例如,A、B和C是D的子表,在表D中不需要列出A、B和C的元素。
(3)广义表可以是递归的表,即广义表可以是本身的一个子表。例如,E就是一个递归的广义表。
任何一个非空广义表的表头可以是一个原子,也可以是一个广义表,而表尾一定是一个广义表。例如:
head(A)=(),tail(A)=(),head(C)=a,tail(C)=((b,c)), head(D)=A,tail(D)=(B,C)
其中,head(A)表示取广义表A的表头元素,tail(A)表示取广义表A的表尾元素。
8.1 广义表
8.1.2 广义表的抽象数据类型
1.数据对象集合
广义表的数据对象集合为{ai|1≤i≤n,ai可以是原子,也可以是广义表}。例如,A=(a,(b,c))是一个广义表, A中包含两个元素a和(b,c),第2个元素为子表,包含了2个元素b和c。若把(b,c)看成一个整体,则a和(b,c)构成了一个线性表,在子表(b,c)的内部,b和c又构成了线性表。故广义表可看作是线性表的扩展。
8.1 广义表
2.基本操作集合
(1)GetHead(L):求广义表的表头。如果广义表是空表,则返回NULL;否则,返回指向表头结点的指针。
(2)GetTail(L):求广义表的表尾。如果广义表是空表,则返回NULL;否则,返回指向表尾结点的指针。
(3)GListLength(L):返回广义表的长度。如果广义表是空表,则返回0;否则,返回广义表的长度。
(4)GListDepth(L):求广义表的深度。广义表的深度就是广义表中括号嵌套的层数。如果广义表是空表,则返回1;否则返回广义表的深度。
(5)CopyGList(T,L):复制广义表。由广义表L复制得到广义表T。复制成功返回1;否则,返回0。
8.2 广义表的头尾链表表示与实现
8.2.1 广义表的头尾链表存储结构
因广义表中有两种元素:原子和子表,所以广义表的链表结点也分为两种:原子结点和子表结点,其中,子表结点包含3个域:标志域、指向表头的指针域和指向表尾的指针域。
原创力文档


文档评论(0)