识别广义表头尾演示数据结构课程设计报告.doc
《识别广义表头尾演示数据结构课程设计报告.doc》由会员分享,可在线阅读,更多相关《识别广义表头尾演示数据结构课程设计报告.doc(28页珍藏版)》请在沃文网上搜索。
1、沈阳航空航天大学课程设计报告 目 录沈阳航空航天大学I学术诚信声明I1 题目介绍与功能描述11.1 题目介绍11.2 具体要求11.3 题目分析12 系统功能模块结构图22.1 系统功能结构图22.2 主要模块功能说明32.2.1 建立广义表32.2.2 对表进行求头尾操作33 数据结构设计及用法说明43.1 存储结构43.2 用法说明44 主要函数54.1 void creatlist(GList &Ls )54.2 void GL_Elem(GListp)74.3 void printf_GL(GList Ls,int &i)74.4 voidGetHead(GList&Ls)94.5 v
2、oidGetTail(GList&Ls)94.6 voidGet_HT(GListLs)105 主要函数流程图125.1 main函数125.2 creatlist函数135.3 printf_GL函数146 调试报告156.1 测试用例设计156.2 调试过程156.3 运行结果16参考文献20附录 源程序清单21 26 沈阳航空航天大学课程设计报告 1 题目介绍与功能描述1.1 题目介绍本课程设计主要完成对广义表的建立以及遍历(输出),并且对已建立的广义表实施操作,操作序列为一串由“t”、“h”以及“”组成的字符串。“t”表示对广义表求表尾,“h”表示对广义表求表头,“”表示遍历当前整个广
3、义表。1.2 具体要求 1.写一个程序,建立广义表的存储结构,演示在此存储结构上实现的广义表求头/求尾操作序列的结果。2.广义表允许多行输入,其中可以任意输入空格符;3.广义表存储结构自定;4.对广义表的操作为一个由t和h组成的字符串;1.3 题目分析设计一个广义表允许分多行输入,其中可以任意地输入空格符,原子是不限长的仅由字母或数字组成的串。广义表采用如教科书中图5.8所示结点的存储结构,按表头和表尾的分解方法编写建立广义表存储结构的算法。对已建立存储结构的广义表施行操作,操作序列为一个仅由“t”(取表尾)或“h”(取表头)组成的串,它可以是空串(此时印出整个广义表),自左至右施行各种操作,
4、再以符号形式显示结果。程序先进行广义表的输入,由程序进行广义表的建立,在打印出来,可检验广义表是否正确的建立。然后进行求头尾的操作序列的输入。由程序进行对广义表进行求头尾的操作。程序中应该多次运用递归的思想,可以使程序显得更加的简洁高效。2 系统功能模块结构图2.1 系统功能结构图识别广义表头尾系统 正确输入广义表 系统建立广义表输入对表的求头尾操作序列求出广义表的头尾 图2.1 系统功能结构图 2.2 主要模块功能说明 2.2.1 建立广义表 建立广义表由函数void creatlist(GList &Ls)完成。当用户完成对广义表的输入后,由此函数完成对广义表的建立。此函数运用递归的思想可
5、以对广义表进行任意地建立。能够输入空格字符,建立为空的广义表。广义表的节点可以为原子,也可以为广义表,能够进行循环的建立直到输入完成,或程序结束。2.2.2 对表进行求头尾操作 对广义表进行求头尾操作是由多个函数共同完成,分别是void GetTail(GList &L void GetHead(GList &Ls),void Get_HT(GList Ls),void GL_Elem(GList p) void printf_GL(GList Ls,int &i)。当输入一串由t和h组成的操作序列后,由函数void Get_HT(GList Ls),对求头尾进行函数的调用。如果是求头则调用G
6、etHead(GList &Ls),如果是求尾则调用void GetTail(GList &Ls),而函数void GL_Elem(GList p)是负责对广义表的原子节点进行输出,函数void printf_GL(GList Ls,int &i)负责对广义表进行整个的输出。 沈阳航空航天大学课程设计报告3 数据结构设计及用法说明3.1 存储结构广义表的存储结构采用的是链式存储结构,每个数据元素可用一个节点表示。由于列表中的数据元素可能为原子或列表,由此需要两种结点:原子结点和表结点。前者用于表示原子,后者用于表示列表,一个表结点可由3个域组成:标志域、指示表头的指针域和指示表尾的指针域;而原
7、子结点只需要两个域:标志域和值域。广义表的存储结构定义形式为: typedef struct GLNode /广义表节点 int tag; /表结点类型(tag=0表示原子结点,tag=1表示表结点) union char data; struct struct GLNode *hr,*tr; ; *GList;3.2 用法说明 对广义表的结构采用链表的形式进行定义,由于广义表可以是原子也可以是表,所以在结构体中还采用了共用体的数据结构。让原子和节点可以共享存储单元。tag代表节点的类型0为原子,1为表。hr代表表的头指针,tr代表表的尾指针。data为表的内容。4 主要函数 程序主体由几个关
8、键函数组成:creatlist(GList&Ls)、GL_Elem(GListp)、printf_GL(GListLs,int&i)、GetHead(GList&Ls)、GetTail(GList&Ls)、Get_HT(GListLs)以及main()函数中的三个部分,下面将对这些函数一一介绍。 4.1 void creatlist(GList &Ls )单独的creatlist()函数并不能创建完整的广义表,需要与main()函数中的第一部分相结合才能共同完成广义表的创建。creatlist()在main中的调用如下: char c; c=getchar(); if(c!=() return
9、 -1,/ 广义表第一个字符必须是(,否则终止函数GList Ls; creatlist(Ls);在整个程序中采用getchar()函数从键盘缓冲区读取输入的广义表数据。creatlist()函数的完全代码如下: void creatlist(GList &Ls ) /建广义表 char c; c=getchar(); /拾取一个合法字符 if(c= ) /空表的情况 Ls=NULL; c=getchar(); if(c!=) return; /空表的下一个合法字符应该是) else /当前输入的广义表非空 GList p; Ls=(GList)malloc(sizeof(GLNode); L
10、s-tag =1; /表结点 if(c!=() /表头为单原子 Ls-hr=(GList)malloc(sizeof(GLNode); p=Ls-hr; p-tag =0; p-data=c; /建立原子结点 else / 表头为广义表 creatlist(Ls-hr); / 对此广义表递归建立存储结构 c=getchar(); if (c=,) creatlist(Ls-tr); /当前广义表未结束,等待输入下一个子表 else if(c=) Ls-tr =NULL; /当前广义表输入结束 广义表是采用递归的方式定义的,因此creatlist()中广义表也是采用递归的方式建立的。由于广义表的
11、第一个字符“(”在main()函数中已被读取,因此creatlist()中从键盘数据缓冲区读取的第一个字符是所输入的广义表的第二个字符。若当层广义表非空,则应建立表结点。在建立原子结点时所用的判断方法为if(c!=()是因为“,”之后的字符要么是“(”,要么是原子。在经过代码:if(c=,) creatlist(Ls-tr); ,递归建立的广义表的读取的第一个字符只能是原子或者“(”,而不可能是“,”,因此建立原子结点的判断方法为if(c!=()。当getchar( )读取的字符为“(”时,表示要进入下一层广义表,故使用语句creatlist(Ls-hr); 递归建立下一层广义表。 当getc
12、har( )读取的字符为“,”时,表示当层广义表未结束,还有子表需要建立,故用creatlist(Ls-tr); 递归建立剩余的子表。 当getchar( )读取的字符为“)”时,表示当层广义表已结束,则表结点的表尾指针应为空,即Ls-tr =NULL; 缺点:函数creatlist( )的纠错能力较差,要求输入的广义表应为广义表的标准正确形式,如(a,b,(a,1,(d,3,4) ,如果输入的形式错误,如:(s,d(,o) 就会造成整个程序无法运行下去。4.2 void GL_Elem(GListp) GL_Elem( )十分简单,只是一个将存储的原子输出的函数,代码如下: void GL_
13、Elem(GList p) / 输出原子 printf(%c,p-data) ; 4.3 void printf_GL(GList Ls,int &i) 这是输出广义表的函数,同creatlist( )函数一样,printf_GL( )并不能单独输出完整的已存储的广义表,它需要与main( )函数中的第二部分相结合才能共同完成广义表的输出。printf_GL( )在main( )中调用方式如下: if(!Ls) printf( ); / Ls指向空表 else couthr; if(!p) /空表 printf( ) else if(p-tag=1) /p指向表结点 printf();i+;
14、printf_GL(p,i); else if(p-tag =0) GL_Elem(p); /若p指向原子结点则输出原子 GList k=Ls-tr; /表结点的尾指针 if(k) printf(,); /尾指针存在表示此表中还有元素 printf_GL(k,i); / 遍历下一结点 else if(!k&i) printf(); i-; 主要思想:解决这两个问题需要分辨出当前指针指向的是第几层子表。对于问题一,假设Ls指向的是当层子表的一个表结点,p=Ls-hr;显然p-tag=0表示p指针所指结点与Ls所指结点在同一层,则只需输出原子即可;p-tag=1表示p指针所指结点为Ls所指结点所在
15、层次的广义表的子层,则输出“(”,并递归遍历p所指层次的广义表,即printf_GL(p,i)。对于问题二,则需要分辨出表结点的尾指针的指向。k=Ls-tr,若k存在,则说明此层子表中仍有元素,故输出“,”,若k不存在,说明此层子表完结,输出“)”。4.4 voidGetHead(GList&Ls) 此函数为求表头函数,此函数的结构并不复杂,代码如下: void GetHead(GList &Ls) /输出广义表的表头 printf(n上表的表头为: ); GList p=Ls; /保存头指针 p-tr=NULL; /隔离出Ls所指广义表的第一个元素 int i=0; printf_GL(p,
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 识别 广义 表头 演示 数据结构 课程设计 报告