零基础学数据结构广义表.pptx
《零基础学数据结构广义表.pptx》由会员分享,可在线阅读,更多相关《零基础学数据结构广义表.pptx(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、8.1 广义表 8.1.1 什么是广义表 广义表,也称为列表(lists),是由n个类型相同的数据元素(a1,a2,a3,an)组成的有限序列。其中,广义表中的元素ai可以是单个元素,也可以是一个广义表。通常,广义表记作:GL=(a1,a2,a3,an)。其中,GL是广义表的名字,n是广义表的长度。如果广义表中的ai是单个元素,则称ai是原子。如果广义表中的ai是一个广义表,则称ai是广义表的子表。习惯上用大写字母表示广义表的名字,用小写字母表示原子。第1页/共28页8.1 广义表 在广义表GL中,a1称为广义表GL的表头(head),其余元素组成的表(a2,a3,an)称为广义表GL的表尾(
2、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)。第2页/共28页8.1 广义表 从上述定义
3、和例子可推出广义表的重要结论如下:(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)表示取广
4、义表A的表头元素,tail(A)表示取广义表A的表尾元素。第3页/共28页8.1 广义表8.1.2 广义表的抽象数据类型 1数据对象集合 广义表的数据对象集合为ai|1in,ai可以是原子,也可以是广义表。例如,A=(a,(b,c)是一个广义表,A中包含两个元素a和(b,c),第2个元素为子表,包含了2个元素b和c。若把(b,c)看成一个整体,则a和(b,c)构成了一个线性表,在子表(b,c)的内部,b和c又构成了线性表。故广义表可看作是线性表的扩展。第4页/共28页8.1 广义表 2基本操作集合 (1)GetHead(L):求广义表的表头。如果广义表是空表,则返回NULL;否则,返回指向表头
5、结点的指针。(2)GetTail(L):求广义表的表尾。如果广义表是空表,则返回NULL;否则,返回指向表尾结点的指针。(3)GListLength(L):返回广义表的长度。如果广义表是空表,则返回0;否则,返回广义表的长度。(4)GListDepth(L):求广义表的深度。广义表的深度就是广义表中括号嵌套的层数。如果广义表是空表,则返回1;否则返回广义表的深度。(5)CopyGList(&T,L):复制广义表。由广义表L复制得到广义表T。复制成功返回1;否则,返回0。第5页/共28页8.2 广义表的头尾链表表示与实现 8.2.1 广义表的头尾链表存储结构 因广义表中有两种元素:原子和子表,所
6、以广义表的链表结点也分为两种:原子结点和子表结点,其中,子表结点包含3个域:标志域、指向表头的指针域和指向表尾的指针域。原子结点包含两个域:标志域和值域。表结点和原子结点的存储结构如图8.1所示。其中,tag=1表示是子表,hp和tp分别指向表头结点和表尾结点,tag=0表示原子,atom用于存储原子的值。第6页/共28页8.2 广义表的头尾链表表示与实现我们将广义表的这种存储结构称为头尾链表存储表示。用头尾链法表示的广义表A=(),B=(a),C=(a,(b,c),D=(A,B,C),E=(a,b,E)如图8.2所示。第7页/共28页8.2 广义表的头尾链表表示与实现 广义表的头尾链表存储结
7、构类型描述如下:typedef enumATOM,LISTElemTag;/*ATOM=0 原子,LIST=1子表*/typedef struct ElemTag tag;/*标志位tag用于区分元素是原子还是子表*/union AtomType atom;/*AtomType 是原子结点的值域*/struct struct GLNode*hp,*tp;/*hp指向表头,tp指向表尾*/ptr;*GList,GLNode;第8页/共28页8.2 广义表的头尾链表表示与实现8.2.2 广义表的基本运算(1)求广义表的表头。GLNode*GetHead(GList L)/*求广义表的表头结点操作*
8、/GLNode*p;if(!L)/*如果广义表为空表,则返回NULL*/printf(“该广义表是空表!”);return NULL;p=L-ptr.hp;/*将广义表的表头指针赋值给p*/if(!p)printf(“该广义表的表头是空表”);else if(p-tag=LIST)printf(“该广义表的表头是非空的子表。”);else printf(“该广义表的表头是原子。”);return p;第9页/共28页8.2 广义表的头尾链表表示与实现(2)求广义表的表尾。GLNode*GeTail(GList L)/*求广义表的表尾*/if(!L)/*广义表为空表,则返回NULL*/print
9、f(“该广义表是空表!”);return NULL;return L-ptr.hp;/*广义表不是空表,返回表尾结点的指针*/第10页/共28页8.2 广义表的头尾链表表示与实现(3)求广义表的长度。求广义表的长度只需要沿着表尾指针tp查找下去,统计子表个数,直到tp为NULL为止。如果广义表是空表,则广义表的长度为0。否则,将指针p指向结点的表尾指针,统计广义表的长度。int GListLength(GList L)int length=0;while(L)/*如果广义表非空,则将p指向表尾指针,统计表的长度*/L=L-ptr.tp;length+;return length;第11页/共2
10、8页8.2 广义表的头尾链表表示与实现 (4)求广义表的深度。求广义表的深度可利用递归实现。如果广义表是空表,则返回1。如果是原子,则返回0。如果是一个非空的广义表,递归求每个子表的深度,令p指向表头结点,即L的第一个元素a1(如果a1是子表),求a1的深度,当求出a1的深度后,然后求L的第2个元素a2的深度。依次类推,最后返回广义表GL深度。广义表的深度就是广义表中括号的层数。假设广义表为GL=(a1,a2,a3,an),ai可能是原子,也可能是子表,求广义表GL的深度可以分解为n个子问题,每个子问题就是求ai的深度。如果ai是原子,则深度为0;如果ai是子表,则继续求ai的深度。广义表GL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基础 数据结构 广义
限制150内