欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    识别广义表头尾演示数据结构课程设计报告Word文档下载推荐.docx

    • 资源ID:7809716       资源大小:619.83KB        全文页数:28页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    识别广义表头尾演示数据结构课程设计报告Word文档下载推荐.docx

    1、广义表的存储结构采用的是链式存储结构,每个数据元素可用一个节点表示。由于列表中的数据元素可能为原子或列表,由此需要两种结点:原子结点和表结点。前者用于表示原子,后者用于表示列表,一个表结点可由3个域组成:标志域、指示表头的指针域和指示表尾的指针域;而原子结点只需要两个域:标志域和值域。广义表的存储结构定义形式为: typedef struct GLNode /广义表节点 int tag; /表结点类型(tag=0表示原子结点,tag=1表示表结点) union char data; struct struct GLNode *hr,*tr; ; *GList;3.2 用法说明 对广义表的结构采

    2、用链表的形式进行定义,由于广义表可以是原子也可以是表,所以在结构体中还采用了共用体的数据结构。让原子和节点可以共享存储单元。tag代表节点的类型0为原子,1为表。hr代表表的头指针,tr代表表的尾指针。data为表的内容。4 主要函数 程序主体由几个关键函数组成:creatlist(GList&Ls)、GL_Elem(GListp)、printf_GL(GListLs,inti)、GetHead(GListLs)、GetTail(GListLs)、Get_HT(GListLs)以及main()函数中的三个部分,下面将对这些函数一一介绍。 4.1 void creatlist(GList &Ls

    3、 )单独的creatlist()函数并不能创建完整的广义表,需要与main()函数中的第一部分相结合才能共同完成广义表的创建。creatlist()在main中的调用如下: char c; c=getchar(); if(c!=() return -1,/ 广义表第一个字符必须是,否则终止函数 GList Ls; creatlist(Ls);在整个程序中采用getchar()函数从键盘缓冲区读取输入的广义表数据。creatlist()函数的完全代码如下: void creatlist(GList &Ls ) /建广义表 char c; c=getchar(); /拾取一个合法字符 if(c=

    4、) /空表的情况 Ls=NULL;) return; /空表的下一个合法字符应该是 else /当前输入的广义表非空 GList p; Ls=(GList)malloc(sizeof(GLNode); Ls-tag =1; /表结点) /表头为单原子hr=(GList)malloc(sizeof(GLNode); p=Ls-hr; p-tag =0;data=c; /建立原子结点 / 表头为广义表 creatlist(Ls-hr); / 对此广义表递归建立存储结构 if (c=,)tr); /当前广义表未结束,等待输入下一个子表 else if(c=tr =NULL; /当前广义表输入结束广义

    5、表是采用递归的方式定义的,因此creatlist()中广义表也是采用递归的方式建立的。由于广义表的第一个字符“(”在main()函数中已被读取,因此creatlist()中从键盘数据缓冲区读取的第一个字符是所输入的广义表的第二个字符。若当层广义表非空,则应建立表结点。在建立原子结点时所用的判断方法为if(c!=()是因为“,”之后的字符要么是“(”,要么是原子。在经过代码:if(c=) creatlist(Ls- ,递归建立的广义表的读取的第一个字符只能是原子或者“(”,而不可能是“,”,因此建立原子结点的判断方法为if(c!=()。当getchar( )读取的字符为“(”时,表示要进入下一层

    6、广义表,故使用语句creatlist(Ls- 递归建立下一层广义表。当getchar( )读取的字符为“,”时,表示当层广义表未结束,还有子表需要建立,故用creatlist(Ls- 递归建立剩余的子表。当getchar( )读取的字符为“)”时,表示当层广义表已结束,则表结点的表尾指针应为空,即Ls-缺点:函数creatlist( )的纠错能力较差,要求输入的广义表应为广义表的标准正确形式,如(a,b,(a,1,(d,3,4) ,如果输入的形式错误,如:(s,d(,o) 就会造成整个程序无法运行下去。4.2 void GL_Elem(GListp) GL_Elem( )十分简单,只是一个将存

    7、储的原子输出的函数,代码如下: void GL_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 coutp) /空表 printf( if(p-tag=1) /p指向表结点 print

    8、f(i+; 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) i-; 主要思想:解决这两个问题需要分辨出当前指针指向的是第几层子表。对于问题一,假设Ls指向的是当层子表的一个表结点,p=Ls-显然p-tag=0表示p指针所指结点与Ls所指结点在同一层,则只需输出原子即可;p-=1表示p指针所指结点为Ls所指结点所在层次的广义表的子层,则输

    9、出“(”,并递归遍历p所指层次的广义表,即printf_GL(p,i)。对于问题二,则需要分辨出表结点的尾指针的指向。k=Ls-tr,若k存在,则说明此层子表中仍有元素,故输出“,”,若k不存在,说明此层子表完结,输出“)”。4.4 voidGetHead(GListLs) 此函数为求表头函数,此函数的结构并不复杂,代码如下: void GetHead(GList &Ls) /输出广义表的表头 printf(n上表的表头为: GList p=Ls; /保存头指针 p-tr=NULL; /隔离出Ls所指广义表的第一个元素 int i=0; printf_GL(p,i);输出广义表的表头,可以利用

    10、printf_GL()函数遍历广义表的第一个元素,具体做法只需将第一个结点的尾指针设为空,则将这一结点从原广义表中独立开来,单独作为一个“广义表”进行遍历,输出的结果即为原广义表的表头。由于广义表的表头为广义表的第一个元素,可以不是一个子表。如广义表(a,(1,2)的表头为a,因此将传递的参数i初始值置为0,这样在最上层的广义表表结点尾指针为空(!k)时,由于i=0,故不需要输出“)”。4.5 voidGetTail(GList 求表尾函数,代码如下: void GetTail(GList &Ls) /输出广义表的表尾 printf(n上表的表尾为: Ls=Ls- if(!Ls) printf

    11、( / Ls指向空表 else printf( / 表尾第一个字符为“(” int i=1; /已有左括号,故i=1 printf_GL(Ls,i); 输出广义表的表尾,可将指向广义表的指针Ls,指向第一个结点的下一个结点,Ls=Ls-这样就能得到原广义表中除第一个元素外其他元素所组成的新表,即原广义表的表尾,然后再利用遍历广义表的方法对该表尾进行遍历即可。4.6 voidGet_HT(GList 这是直接求表头,表尾的函数,由它接收输入。此函数实现对广义表求头尾操作的函数,解释输入的操作序列命令(由“t”、“h”、“”组成的字符串),并执行。代码如下: void Get_HT(GList L

    12、s) / 执行求广义表表头(尾)的操作函数 char ch=getchar(); while(ch) GList p=Ls; /保存表头指针 if(!p) printf(n当前表为空表,不能执行求头尾操作n break; else switch(ch) case t:GetTail(Ls);break; case hGetHead(Ls); /空串时输出整个广义表 printf(n上表为: if(! else printf( / 广义表第一个字符为“(” int i=1; printf_GL(Ls,i); break; default : return ; ch=getchar();Get_H

    13、T()函数中同样是利用getchar()函数读取输入的操作命令。根据读取到的不同字符,完成不同的操作。5 主要函数流程图5.1 main函数 否 是 图5.1 main函数流程图主函数较简洁,操作都放在具体函数之上。5.2 creatlist函数 是 否 是 否 输入为) 图5.2 createlist函数流程图 建表函数主要运用递归的思想对广义表进行建立,循环的建立表头,表尾,直到输入的为反括号为止结束。在建表的时候需要对表进行判断,判断输入的是否为空或字符。5.3 printf_GL函数 图5.3 printf_GL函数流程图 输出函数是整个程序很重要的函数,取表头,取表尾的操作都依靠输出

    14、函数,表头,表尾函数与输出函数结合构成整个程序的核心。6 调试报告6.1 测试用例设计1.输入:(a,b),(c,d) 操作:thth2.输入: ( ),(e),(a,(b,c,d) 操作:tth3 输入:(b,c),( ),d),(e) 操作:htht4 输入:(3,4,5,( ),2,d) 操作:h tth注意:“()”和“()”是不同的,前者括号内无空格符,后者有,本程只能识别后一种。“()”代表空表。测试用例(3)中,操作序列“htth”是由5个字符h、空格符、t、t、h组成,其中空格符表示空串。6.2 调试过程 遇到问题: (1)当求表头时,输出时,在结果末尾会多出现一个右括号“)”

    15、,例 如:对于广义表(1,2,3)进行求表头操作,得到的结果为:1) 。正确的结果应为:1。 (2)第一次输入广义表的数据后,无法再输入求头尾的操作序列,使 得程序不能完成应有的求头尾的功能原因及解决方法: (1)问题原因:问题出在遍历函数printf_GL( )中,在求头尾的操作中, 由于将第一个表结点的尾指针置为空,将其从原广义表中独立出来,使得在printf_GL( )中,执行了一次printf(); 解决方法:设置一个括号计数器i,当输出一个“(”时,i+,输 出一个“)”时,i - - 。并利用i的值判断是否应当输出“)”,即判断条 件为if(!i) ,(见printf_GL( )函

    16、数)求表头时,将传递参数i的值置为0,则在出现最后一个尾指针为空的情况时,i=0,故不能执行printf(“)”);语句。 (2)问题原因:程序中使用了两次不同需求的getchar( )函数,但是当 用户键入回车之后,getchar才开始从stdin流中每次读入一个字符。在第一次输入过程中,由于输入了广义表之后,键入了回车,导致接下来的getchar( )函数均是从键盘缓冲区中读入数据,使得用户无法输入新数据。通过 fflush(stdin); 来清空输入缓冲区,以确保不影响后面的数据读取。将此语句放在main( )函数第一部分的末尾,即在建立好广义表后清空缓冲区。6.3 运行结果课程设计总结

    17、: 在此次的课程设计之前,我对广义表的内容了解的比较模糊。经过此次课程设计,对于广义表的存储结构以及求头尾操作,我有了较深的理解。广义表的用途十分广泛,因此要求了广义表的灵活性。广义表的存储结构是链式的,且类似于二叉树,广义表与二叉树的表头结点均有两个指针,但是二叉树的指针是自上而下的联系,而广义表中的尾指针是指向同层结点,因此有横向的联系,这点上与二叉树不同。对广义表的求头尾操作中要注意:广义表的表头是广义表中的第一个元素,而广义表的表尾是除第一个元素外其他元素组成的表。即广义表的表尾一定是广义表,而表头是否为广义表,取决于第一个元素的类型。由于时间问题,很多地方我都没有精雕细琢,导致本程序

    18、的容错能力不是很好,即健壮性较差,需要改进的地方有很多。本程序尤其对输入的广义表要求很高,若输入的广义表出错,而用户没有发现,将会照成程序无法运行。软件设计的健壮与否直接反应了分析设计和编码人员的水平,即所谓高手写的程序不容易死,因此我还有很多值得学习的内容,有很多地方需要提高。参考文献 1谭浩强.C程序设计.北京.清华大学出版社,20022严蔚敏,吴伟民.数据结构(C语言版).北京.清华大学出版社,2002附录 源程序清单#includestdlib.h typedef struct GLNode /广义表结点定义 /表结点类型 (tag=0表示原子结点,tag=1表示表结点) union

    19、char data; struct struct GLNode *hr,*tr; /h为表头指针 t为表尾指针 ;Ls ) /建广义表 /拾取一个合法字符 ) /空表的情况 else /当前输入的广义表非空 /表结点 ) /表头为单原子 /建立原子结点 / 表头为广义表 / 对此广义表递归建立存储结构 c=getchar(); /当前广义表未结束,等待输入下一个子表 /当前广义表输入结束 i) /输出(遍历)Ls指针所指向的广义表 /i为括号计数器 p) /空表 else if(p-tag=1) /p指向表结点 i+; printf_GL(p,i); else if(p-tag =0) GL_Elem(p); /若p指向原子结点则输出原子 /表结点的尾指针 if(k) /尾指针存在表示此表中还有元素 / 遍历下一结点 else if(! void GetHead(GList & /保存头指针 /隔离出Ls所指广义表的第一个元素 printf_GL(Ls,i); Ls=Ls- Ls) /输出广义表的表尾 n上


    注意事项

    本文(识别广义表头尾演示数据结构课程设计报告Word文档下载推荐.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开