版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第7章 广义表,广义表的概念 广义表的存储结构 广义表的操作实现,主要知识点,2,广义表是n(n0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。 广义表可以看作是线性表的推广,但如果从原子数据元素的角度看,一个数据元素有多个后继原子数据元素,就属于下一章要讨论的树型结构。所以,广义表本质上是非线性结构。,7.1 广义表的概念,3,一个广义表通常用一对圆括号括起来,这样当这个广义表中的某个数据元素又是一个广义表时,就可以再用一对括号括起来。广义表中的原子数据元素通常用小写字母表示,而广义表通常用大写字母表示。从结构上看一个广义表对应了一棵树。例如
2、,设有如下广义表: A = () B = (a, b, c) C = (d) D = (B, C) = (a, b, c), (d) E = (D, e) = (a, b, c), (d), e)。,4,广义表E的图形表示,5,广义表的长度指广义表中数据元素(原子元素或广义表)的个数。如广义表A的长度为0,广义表B的长度为3,广义表C的长度为1,广义表D的长度为2(注意D中只有两个数据元素B和C),广义表E的长度为2。 广义表的原子元素个数指广义表中原子数据元素的个数。如广义表A的原子元素个数为0,广义表B的原子元素个数为3,广义表C的原子元素个数为1,广义表D的原子元素个数为4,广义表E的原
3、子元素个数为5。 广义表的深度指广义表中所有原子数据元素到达根结点的最大值。一个广义表对应了一棵树,广义表的深度即是指广义表所对应的树的深度。如广义表A,B和C的深度均为1,广义表D的深度为2,广义表E的深度为3。,6,一个广义表无论简单或复杂,都可以分做表头和表尾两部分。任何一个非空广义表的表头既可能是原子也可能是广义表,但非空广义表的表尾一定是一个广义表。 例如广义表(a,b),其表头为原子a,其表尾为广义表(b);又例如广义表(b),其表头为原子b,其表尾为空广义表();又例如广义表(a,b,c),(d),e),其表头为广义表(a,b,c),(d),其表尾为广义表(e)。 对任何一个广义
4、表的处理都可以由对表头的处理部分和对表尾的处理部分两部分组成。 广义表有许多应用,其中最典型的,是在表处理语言LISP中,把广义表作为基本的数据结构,就连程序也表示为一系列的广义表。另外,广义表还可以用来表示m元多项式。所谓m元多项式就是其每一项最多允许有m个变元。,7,数据集合: 广义表的数据集合可以表示为a0, a1, a2, ., an-1,每个 数据元素或是原子元素,或是一个广义表。 操作集合: (1)创建广义表CreatGList(S) (2)求长度GListLength(L) (3)求原子元素个数GListAtomNum(L) (4)求深度GListDepth(L),广义表抽象数据
5、类型,8,(5)判非空否GListNotEmpty(L) (6)取表头GetHead(L) (7)取表尾GetTail(L) (8)插入GListInsert(L, e) (9)删除GListDelete(L, e) (10)查找原子元素GListSearch(L, e) (11)撤消DestroyGList(L),9,7.2 广义表的存储结构,头链和尾链存储结构 一个广义表可以由表头和表尾两部分组成,所以可以用一个头指针和一个尾指针表示一个广义表。这样,头链和尾链结构中一个结点的结构由一个标志域tag决定:当tag值为1时,该结点除标志域外还有一个头指针域和一个尾指针域;当tag值为0时,该
6、结点除标志域外还有一个原子元素域。,10,11,原子和子表存储结构 观察上图中的结点可以发现,头链和尾链存储结构中当结点为原子元素时,需要由头指针所指的结点存储该原子元素。若此时在该结点中直接存储该原子元素,则构成了原子和子表结构。其中标志tag含义同上,即tag值为1时,该结点除标志域外还有一个头指针域和一个尾指针域;当tag值为0时,该结点除标志域外还有一个原子元素域,12,13,7.3 广义表的操作实现,本节分别讨论头链和尾链存储结构下和原子和子表存储结构下一些典型操作的算法实现。 头链和尾链存储结构下,结点的结构体定义 typedef struct GListNode int tag;
7、 union DataType atom;/原子元素域 struct struct GListNode *head;/头链 struct GListNode *tail;/尾链 subList; val; GLNode;,14,创建广义表 创建广义表就是按照所给的表示具体广义表的字符串str创建一个广义表h。 对一个广义表的任何操作都可以分解为对表头的操作和对表尾的操作。同样,创建广义表操作可以分解为创建表头广义表和创建表尾广义表。因此,创建广义表函数CreatGList(str)只要递归完成对表头广义表的创建和对表尾广义表的创建即可。 这样,还需要设计一个把表示广义表的字符串str分解成表头
8、字符串hstr和表尾字符串str的函数DecomposeStr(str, hstr)。,15,void DecomposeStr(char str, char hstr) int i, j, tag, n = strlen(str); char ch;ch = str0;tag = 0; for(i = 0; i = n-1; i+) if(stri = , / ,16,else str+; strncpy(hstr,str, n-2); hstrn-2 = 0; str-; strcpy(str, (); ,17,GLNode* CreatGList(char str) GLNode *h;
9、 char hstr200; int len = strlen(str); if(strcmp(str, () = 0) h = NULL; else if(len = 1) h = (GLNode *)malloc(sizeof(GLNode); h-tag = 0; h-val.atom = str0; ,18,else h = (GLNode *)malloc(sizeof(GLNode); h-tag = 1; DecomposeStr(str, hstr); h-val.subList.head = CreatGList(hstr); if(strcmp(str, () != 0)
10、h-val.subList.tail = CreatGList(str); else h-val.subList.tail = NULL; return h; ,19,求广义表的深度 广义表的深度是广义表中所有原子数据元素到达根结点的最大值。 int GListDepth(GLNode *h) int max, dep; GLNode *pre; if(h = NULL) return 1; if(h-tag = 0) return 0; pre = h; for(max = 0; pre != NULL; pre = pre-val.subList.tail) dep = GListDept
11、h(pre-val.subList.head); if(dep max) max = dep; return max + 1; ,20,求广义表长度 在头链和尾链存储结构中,广义表的长度就是表尾指针构成的单链表的长度。 int GListLength(GLNode *h) int number = 0; GLNode *p; for(p = h; p != NULL; p = p-val.subList.tail) number+; return number; ,21,求广义表中原子元素个数 int GListAtomNum(GLNode *h) if(h = NULL) return 0;
12、 else if(h-tag = 0) return 1; else return GListAtomNum(h-val.subList.head) + GListAtomNum(h-val.subList.tail); ,22,原子和子表存储结构下的操作实现,原子和子表存储结构下,结点的结构体定义 typedef struct GListNode int tag; struct GListNode *tail; union DataType atom; struct GListNode *head; val; GLNode2;,23,创建广义表,创建广义表就是按照所给的表示具体广义表的字符串
13、str创建一个广义表h。 和头链和尾链存储结构广义表的创建算法类同,原子和子表存储结构的创建广义表操作同样可以分解为创建表头广义表和创建表尾广义表。 把表示广义表的字符串str分解成表头字符串hstr和表尾字符串str的函数DecomposeStr(str, hstr)设计和前面的方法完全相同。,24,创建函数如下: GLNode2* CreatGList(char str) GLNode2 *h; char hstr200; int len = strlen(str); if(strcmp(str, () = 0) h = NULL; else h = (GLNode2 *)malloc(sizeof(GLNode2); if(len = 1) h-tag = 0; h-val.atom = str0; h-tail = NULL; ,25,e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年江西省萍乡市高考英语二模试卷
- 出纳员试用期转正工作总结
- 2026年新高考卷生物等值线规律专题卷含解析
- 胶印版材工艺工发展趋势水平考核试卷含答案
- 攀岩指导员岗前复测考核试卷含答案
- 聚甲基丙烯酸甲酯(PMMA)装置操作工岗前冲突管理考核试卷含答案
- 电线电缆包制工冲突管理评优考核试卷含答案
- 死畜无害化处理工操作安全模拟考核试卷含答案
- 《短视频制作》课件 项目四 制作美食短视频
- 2026四年级下《小数的加法和减法》同步精讲
- 2025年广西壮族自治区崇左市初二学业水平地理生物会考真题试卷(含答案)
- (二检)莆田市2026届高三第二次质量调研测试政治试卷(含答案)
- 毕业设计(伦文)-皮革三自由度龙门激光切割机设计
- 一项目一档案管理制度
- 2025华润建材科技校园招聘正式启动笔试历年参考题库附带答案详解
- 2025新教材-译林版-七年级英语-上册-单词表
- 企业法律合规实务操作指南
- DG-TJ 08-2122-2021 保温装饰复合板墙体保温系统应用技术标准
- 行政人事管理实务作业指导书
- 拇指再造手术
- 2025高考语文复习之60篇古诗文原文+翻译+赏析+情景默写
评论
0/150
提交评论