版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章广义表5.1广义表的定义5.2广义表操作的实现第5章广义表5.1广义表的定义15.1广义表的定义
5.1.1定义广义表(Lists)简称表,它是线性表的推广。一个广义表是n(n≥0)个元素的序列,当n=0时称为空表。在一个非空的广义表中,其元素可以是某一确定类型的对象(这种元素被称作单元素),也可以是由单元素构成的表(这种元素可相对地被称作子表或表元素)。显然,广义表的定义是递归的,广义表是一种递归的数据结构。5.1广义表的定义
5.1.1定义广义表(Lists)简2设ai为广义表的第i个元素,广义表LS可表示为:LS=(a1,a2,…,an)其中: ①LS——广义表的名字; ②n——广义表的长度; ③; ④n=0空表; ⑤当广义表非空时,称a1为表头(head),其余元素组成的表(a2,a3,…,an)为表尾(tail);广义表的抽象数据类型:P107设ai为广义表的第i个元素,广义表LS可表示为:35.1.2举例分别用圆圈和方框表示表(表元素)和单元素①A=()空表,其长度为零。
②B=(e)B中只有一个单元素,长度为1,表头为'e',表尾为空。
5.1.2举例分别用圆圈和方框表示表(表元素)和单元素4③C=(a,(b,c,d))长度为2,表头为‘a’,表尾为子表((b,c,d))。③C=(a,(b,c,d))5④D=(A,B,C) 长度为3,表头为A,表尾为(B,C)。⑤E=(a,E) 长度为2,表头为a,表尾为(E)--表头为E,表尾为()。E相当于无穷表(a,(a,(a,(…))))。④D=(A,B,C)65.1.3广义表的几个性质①有次序性:广义表中的数据元素有固定的相对次序。线性排列--线性表的推广层次结构--树的推广②有长度:广义表的长度定义为最外层括弧中包含的数据元素个数。表元素个数一定,不能无限,可以是空表。5.1.3广义表的几个性质①有次序性:7③有深度:广义表的深度(多少层)定义为广义表书写形式中括弧的最大重数,因此空表的深度为1,因为一个"单原子"不是广义表,所以没有"深度"可言,但可以认为它的深度为0。如:A,B:1;C:2;D:3;E:无穷大。④可递归:如E。⑤可共享:子表可共享。③有深度:85.1.4广义表的存储结构由于广义表中的数据元素可以是原子,也可以是广义表,显然难以用顺序存储结构表示。由于列表中的数据元素可能为原子或列表,由此需要两种结构的结点:一种是表结点,用以表示列表;一种是原子结点,用以表示原子。5.1.4广义表的存储结构由于广义表中的数据元素可以是原子9为了在存储结构中便于分辩原子和子表,令表示广义表的链表中的结点为"异构"结点,如图所示,结点中设有一个"标志域tag",并约定tag=0表示原子结点,tag=1表示表结点。原子结点中的data域存储原子,表结点中指针域的两个值分别指向表头和表尾。tag=0atom原子结点ptr---表结点的指针域tag=1hptp表结点为了在存储结构中便于分辩原子和子表,令表示广义表的链表中的结10广义表的头尾链表存储表示:enumElemTag{ATOM,LIST};typedefcharAtomType;structGLNode{ ElemTagtag; union{ AtomTypeatom; struct{ GLNode*hp,*tp; }ptr; };};typedefGLNode*GList;广义表的头尾链表存储表示:enumElemTag{ATO11例:广义表L=(a,(x,y),((z)))的存储结构。可由对L进行表头和表尾的分析得到--若列表不空,则可分解成表头和表尾(采用头尾链表存储结构)。分析:①L为一非空列表例:广义表L=(a,(x,y),((z)))的存储结构。12②L的表头为原子a②L的表头为原子a13③L的表尾为列表((x,y),((z)))③L的表尾为列表((x,y),((z)))14④((x,y),((z)))的表头为列表(x,y)④((x,y),((z)))的表头为列表(x,y)15其余分析同上。其余分析同上。165.2广义表操作的实现基于广义表是递归定义的结构,因此实现广义表操作的算法均为递归函数。5.2广义表操作的实现基于广义表是递归定义的结构,因此实现175.2.1分治法与递归求解分治法是进行算法设计的一种方法,其严格定义为: 对于一个输入规模为n的函数或问题,用某种方法把输入分割成k(1<k≤n)个子集,从而产生m个子问题,分别求解这m个问题,得出m个问题的子解,再用某种方法把它们组合成原来问题的解。若子问题还相当大,则可以反复使用分治法,直至最后所分得的子问题足够小,以至可以直接求解为止。在利用分治法求解时,若所得子问题的性质和原问题相同,则可递归求解。5.2.1分治法与递归求解分治法是进行算法设计的一种方法,18何谓"递归函数"?一个含直接或间接调用本函数语句的函数被称之为递归函数,它必须满足以下两个条件:①在每一次调用自己时,必须是(在某种意义上)更接近于解;②函数中必须有一个终止处理或计算的准则。何谓"递归函数"?一个含直接或间接调用本函数语句的函数被称之195.2.2广义表的头尾链表存储表示
glist.h#include<iostream>#include<string>usingnamespacestd;enumElemTag{ATOM,LIST};typedefcharAtomType;5.2.2广义表的头尾链表存储表示
glist.h#inc20structGLNode{ ElemTagtag; union{//匿名共用体 AtomTypeatom; struct{ GLNode*hp,*tp; }ptr; };};typedefGLNode*GList;structGLNode{21voidinitGList(GList&L);//创建空的广义表LintgetLength(GListL);intgetDepth(GListL);voidcreatGList(GList&L,strings);voidprintGList(GList&L,intk=0);voidinitGList(GList&L);//创225.2.3操作的实现
glist.cpp#include"glist.h"⑴初始化voidinitGList(GList&L)//创建空的广义表L{ L=NULL;}⑵求广义表的长度intgetLength(GListL)//返回广义表的长度,即元素个数{ if(!L) return0; else return1+getLength(L->ptr.tp);}5.2.3操作的实现
glist.cpp#include23⑶求广义表的深度intgetDepth(GListL)//采用头尾链表存储结构,求广义表L的深度{ intmax=0,dep; GListp; if(!L) return1;//空表深度为1 if(L->tag==ATOM) return0;//原子深度为0 for(p=L;p;p=p->ptr.tp){ dep=getDepth(p->ptr.hp);
//求以p->a.ptr.hp为头指针的子表深度 if(dep>max) max=dep;}returnmax+1;
//非空表的深度是各元素的深度的最大值加1}⑶求广义表的深度24⑷建立广义表以广义表字符串S建立广义表。从前面的讨论可知,非空广义表可分解成表头和表尾两个部分。建表时,可分别建立(分解为两个子问题):表头有两种情况,为单原子或为列表,当为列表时与原问题相同;表尾必为列表,与原问题相同。设stringsever(string&S)函数的功能为:
从广义表字符串S中提取表头串返回,并将S置成表尾串。⑷建立广义表25//将非空串str分割成两部分://hsub为最外层第一个','之前的子串,str为之后的子串stringsever(string&str){ intn,k,i;//k记录尚未配对的左括号个数 stringch,hstr; n=str.length(); for(i=0,k=-1;i<n&&(ch!=","||k!=0);++i){
//搜索最外层的第一个逗号 ch=str.substr(i,1);//从第i个位置起,取1个字符 if(ch=="(") ++k; elseif(ch==")") --k; }//将非空串str分割成两部分:26 if(i<n){ hstr=str.substr(1,i-2); str="("+str.substr(i,n-i); } else{ hstr=str.substr(1,n-2); str=""; } returnhstr;} if(i<n)27S的值有三种情况:①"()"--空表②单字符串--原子结点③多字符串--列表算法:①当S="()",广义表L为空--L=NULL;②否则,L为列表--创建表结点; A.当S为单字符串时,为原子结点--建原子结点的子表; B.否则,S为列表字符串--创建表结点;a.从S中提取表头串hsub及表尾串tsub;b.以hsub建表头--与原问题相同,递归;c.如表尾串tsub为空--置表尾为NULL;否则,以tsub建表尾,递归。S的值有三种情况:28//由广义表的书写形式串S创建广义表LvoidcreatGList(GList&L,stringS){ stringhsub; if(S=="()") L=NULL;//创建空表 else{ L=newGLNode;//建表结点 if(S.length()==1)//S为单原子{ L->tag=ATOM; L->atom=S[0];//创建单原子广义表 }//由广义表的书写形式串S创建广义表L29 else{ L->tag=LIST; hsub=sever(S);//从sub中分离出表头串hsub
creatGList(L->ptr.hp,hsub); if(S.empty())//表尾串为空 L->ptr.tp=NULL; else creatGList(L->ptr.tp,S); } }} else30⑸以字符串形式输出广义表voidprintGList(GList&L,intk)//利用递归算法输出广义表L{ if(!L) cout<<"()"; else{ if(L->tag==1){ if(k==0) cout<<'('; if(L->ptr.hp==NULL) cout<<"()"; else printGList(L->ptr.hp,0);⑸以字符串形式输出广义表31 if(L->ptr.tp){ cout<<','; printGList(L->ptr.tp,1); } if(k==0) cout<<')'; } else cout<<L->atom; }} if(L->ptr.tp)325.2.4应用
main.cpp#include"glist.h"intmain(){ stringS1="((),(e),(a,(b,c,d)))"; stringS2="(a,(x,y),((z)))"; stringS3="(a,b)"; stringS4="()"; GListL; initGList(L); creatGList(L,S2); cout<<getLength(L)<<endl; cout<<getDepth(L)<<endl; printGList(L);}5.2.4应用
main.cpp#include"gli33第5章广义表5.1广义表的定义5.2广义表操作的实现第5章广义表5.1广义表的定义345.1广义表的定义
5.1.1定义广义表(Lists)简称表,它是线性表的推广。一个广义表是n(n≥0)个元素的序列,当n=0时称为空表。在一个非空的广义表中,其元素可以是某一确定类型的对象(这种元素被称作单元素),也可以是由单元素构成的表(这种元素可相对地被称作子表或表元素)。显然,广义表的定义是递归的,广义表是一种递归的数据结构。5.1广义表的定义
5.1.1定义广义表(Lists)简35设ai为广义表的第i个元素,广义表LS可表示为:LS=(a1,a2,…,an)其中: ①LS——广义表的名字; ②n——广义表的长度; ③; ④n=0空表; ⑤当广义表非空时,称a1为表头(head),其余元素组成的表(a2,a3,…,an)为表尾(tail);广义表的抽象数据类型:P107设ai为广义表的第i个元素,广义表LS可表示为:365.1.2举例分别用圆圈和方框表示表(表元素)和单元素①A=()空表,其长度为零。
②B=(e)B中只有一个单元素,长度为1,表头为'e',表尾为空。
5.1.2举例分别用圆圈和方框表示表(表元素)和单元素37③C=(a,(b,c,d))长度为2,表头为‘a’,表尾为子表((b,c,d))。③C=(a,(b,c,d))38④D=(A,B,C) 长度为3,表头为A,表尾为(B,C)。⑤E=(a,E) 长度为2,表头为a,表尾为(E)--表头为E,表尾为()。E相当于无穷表(a,(a,(a,(…))))。④D=(A,B,C)395.1.3广义表的几个性质①有次序性:广义表中的数据元素有固定的相对次序。线性排列--线性表的推广层次结构--树的推广②有长度:广义表的长度定义为最外层括弧中包含的数据元素个数。表元素个数一定,不能无限,可以是空表。5.1.3广义表的几个性质①有次序性:40③有深度:广义表的深度(多少层)定义为广义表书写形式中括弧的最大重数,因此空表的深度为1,因为一个"单原子"不是广义表,所以没有"深度"可言,但可以认为它的深度为0。如:A,B:1;C:2;D:3;E:无穷大。④可递归:如E。⑤可共享:子表可共享。③有深度:415.1.4广义表的存储结构由于广义表中的数据元素可以是原子,也可以是广义表,显然难以用顺序存储结构表示。由于列表中的数据元素可能为原子或列表,由此需要两种结构的结点:一种是表结点,用以表示列表;一种是原子结点,用以表示原子。5.1.4广义表的存储结构由于广义表中的数据元素可以是原子42为了在存储结构中便于分辩原子和子表,令表示广义表的链表中的结点为"异构"结点,如图所示,结点中设有一个"标志域tag",并约定tag=0表示原子结点,tag=1表示表结点。原子结点中的data域存储原子,表结点中指针域的两个值分别指向表头和表尾。tag=0atom原子结点ptr---表结点的指针域tag=1hptp表结点为了在存储结构中便于分辩原子和子表,令表示广义表的链表中的结43广义表的头尾链表存储表示:enumElemTag{ATOM,LIST};typedefcharAtomType;structGLNode{ ElemTagtag; union{ AtomTypeatom; struct{ GLNode*hp,*tp; }ptr; };};typedefGLNode*GList;广义表的头尾链表存储表示:enumElemTag{ATO44例:广义表L=(a,(x,y),((z)))的存储结构。可由对L进行表头和表尾的分析得到--若列表不空,则可分解成表头和表尾(采用头尾链表存储结构)。分析:①L为一非空列表例:广义表L=(a,(x,y),((z)))的存储结构。45②L的表头为原子a②L的表头为原子a46③L的表尾为列表((x,y),((z)))③L的表尾为列表((x,y),((z)))47④((x,y),((z)))的表头为列表(x,y)④((x,y),((z)))的表头为列表(x,y)48其余分析同上。其余分析同上。495.2广义表操作的实现基于广义表是递归定义的结构,因此实现广义表操作的算法均为递归函数。5.2广义表操作的实现基于广义表是递归定义的结构,因此实现505.2.1分治法与递归求解分治法是进行算法设计的一种方法,其严格定义为: 对于一个输入规模为n的函数或问题,用某种方法把输入分割成k(1<k≤n)个子集,从而产生m个子问题,分别求解这m个问题,得出m个问题的子解,再用某种方法把它们组合成原来问题的解。若子问题还相当大,则可以反复使用分治法,直至最后所分得的子问题足够小,以至可以直接求解为止。在利用分治法求解时,若所得子问题的性质和原问题相同,则可递归求解。5.2.1分治法与递归求解分治法是进行算法设计的一种方法,51何谓"递归函数"?一个含直接或间接调用本函数语句的函数被称之为递归函数,它必须满足以下两个条件:①在每一次调用自己时,必须是(在某种意义上)更接近于解;②函数中必须有一个终止处理或计算的准则。何谓"递归函数"?一个含直接或间接调用本函数语句的函数被称之525.2.2广义表的头尾链表存储表示
glist.h#include<iostream>#include<string>usingnamespacestd;enumElemTag{ATOM,LIST};typedefcharAtomType;5.2.2广义表的头尾链表存储表示
glist.h#inc53structGLNode{ ElemTagtag; union{//匿名共用体 AtomTypeatom; struct{ GLNode*hp,*tp; }ptr; };};typedefGLNode*GList;structGLNode{54voidinitGList(GList&L);//创建空的广义表LintgetLength(GListL);intgetDepth(GListL);voidcreatGList(GList&L,strings);voidprintGList(GList&L,intk=0);voidinitGList(GList&L);//创555.2.3操作的实现
glist.cpp#include"glist.h"⑴初始化voidinitGList(GList&L)//创建空的广义表L{ L=NULL;}⑵求广义表的长度intgetLength(GListL)//返回广义表的长度,即元素个数{ if(!L) return0; else return1+getLength(L->ptr.tp);}5.2.3操作的实现
glist.cpp#include56⑶求广义表的深度intgetDepth(GListL)//采用头尾链表存储结构,求广义表L的深度{ intmax=0,dep; GListp; if(!L) return1;//空表深度为1 if(L->tag==ATOM) return0;//原子深度为0 for(p=L;p;p=p->ptr.tp){ dep=getDepth(p->ptr.hp);
//求以p->a.ptr.hp为头指针的子表深度 if(dep>max) max=dep;}returnmax+1;
//非空表的深度是各元素的深度的最大值加1}⑶求广义表的深度57⑷建立广义表以广义表字符串S建立广义表。从前面的讨论可知,非空广义表可分解成表头和表尾两个部分。建表时,可分别建立(分解为两个子问题):表头有两种情况,为单原子或为列表,当为列表时与原问题相同;表尾必为列表,与原问题相同。设stringsever(string&S)函数的功能为:
从广义表字符串S中提取表头串返回,并将S置成表尾串。⑷建立广义表58//将非空串str分割成两部分://hsub为最外层第一个','之前的子串,str为之后的子串stringsever(string&str){ intn,k,i;//k记录尚未配对的左括号个数 stringch,hstr; n=str.length(); for(i=0,k=-1;i<n&&(ch!=","||k!=0);++i){
//搜索最外层的第一个逗号 ch=str.substr(i,1);//从第i个位置起,取1个字符 if(ch=="(") ++k; elseif(ch==")") --k; }//将非空串str分割成两部分:59 if(i<n){ hstr=str.substr(1,i-2); str="("+str.substr(i,n-i); } else{ hstr=str.substr(1,n-2); str=""; } returnhstr;} if(i<n)60S的值有三种情况:①"()"--空表②单字符串--原子结点③多字符串--列表算法:①当S="()",广义表L为空--L=NULL;②否则,L为列表--创建表结点; A.当S为单字符串时,为原子结点--建原子结点的子表; B.否则,S为列表字符串--创建表结点;a.从S中提取表头串hsub及表尾串tsub;b.以hsub建表头--与原问题相同,递归;c.如表尾串tsub为空--置表尾为NULL;否则,以tsub建表尾,递归。S的值有三种情况:61//由广义表的书写形式串S创建广义表LvoidcreatGList(GList&L,stringS){ stringhsub; if(S=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 花卉种苗工基础应用能力考核试卷含答案
- 二甲醚装置操作工岗中全能考核试卷含答案
- 手工地毯图案工环保知识竞赛考核试卷含答案
- 钒铁沉淀工岗中应急处理水平考核试卷含答案
- 2026年快速接头行业洞察报告及未来五至十年发展趋势报告
- 人教版高中三年级语文上学期期末测试卷2025-2026测试
- 河北版高中一年级语文上学期期末测试卷
- 2025-2026华东师大版高中三年级语文测试卷
- 安全知识教育模板
- 安全知识班会主题
- 大学志愿者活动管理办法
- 护理人员心理健康的自我调适
- 变压器检修作业指导书
- 雨课堂学堂云在线《中共中央延安十三年史(陕西师大 )》单元测试考核答案
- 2024年《广西壮族自治区房屋修缮工程消耗量定额(建筑装饰工程)》
- 2025中国北方工业有限公司校园招聘笔试历年备考题库附带答案详解2套试卷
- 《水墨中的山石树木》(课件)-2025-2026学年冀美版(2024)初中美术八年级上册
- 信息技术系统故障应急处理流程
- 软件公司客户现场服务规定
- 山东名校考试联盟2024−2025学年高二上学期期中检测数学试题含答案
- HSK标准教程5上-课件-L3
评论
0/150
提交评论