




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河南工程学院数据结构与算法课程设计成果报告树与二叉树转换的实现学生学号: 学生姓名: 学 院: 计算机学院 专业班级: 软件工程1341班 专业课程: 数据结构与算法 指导教师: 2014 年 12 月 29 日题 目树与二叉树转换的实现考核项目考核内容得分平时考核(30分)出勤情况、态度、效率;知识掌握情况、基本操作技能、知识应用能力、获取知识能力系统设计(20分)分析系统的功能模块编程调试(20分)实现系统的各个功能模块,并完成调试回答问题(15分)回答老师针对课程设计提出的问题课程设计报告撰写(10分)严格按照规范要求完成课程设计报告源代码(5分)按照规范要求完成课程设计源代码的排版总 评 成 绩指导教师评语: 日期: 年 月 日目 录1 课程设计目标与任务11.1 课程设计目标11.2 课程设计任务11.3 课程设计所用设施12 分析与设计22.1 题目分析22.2 存储结构设计22.3 算法描述32.4 程序流程图63 程序清单74 测试114.1 测试数据114.2 测试结果分析125 课程设计体会13参考文献141 课程设计目标与任务1.1 课程设计目标数据结构课程设计是在学完数据结构课程之后的实践教学环节。该实践教学是软件设计的综合训练,包括问题分析,总体结构设计用户界面设计,程序设计基本技能和技巧。要求学生在设计中逐步提高程序设计能力培养科学的软件工作方法学生通过数据结构课程设计各方面得到锻炼:(1)能根据实际问题的具体情况结合数据结构课程中的基本理论和基本算法,正确分析出数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法;(2)通过上机实习,验证自己设计的算法的正确性,学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改;(3)培养算法分析能力,分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平;(4)尽可能借助语言环境实现图形显示功能,以便将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来,获得算法的直观感受。1.2 课程设计任务根据提供的实习题目,认真完成软件设计的全部过程,并以最终软件设计成果来证明其独立完成实际任务的能力,从而,反映出理解和运用数据结构与算法的水平和能力,最后完成软件设计和程序调试并提交文档:课程设计报告书,报告书中包含设计的算法及部分程序代码。1.3 课程设计所用设施 PC机、VC6.0语言编辑、编译运行工具、文档编辑软件等。2 分析与设计2.1 题目分析根据所提供的题目,是要实现树与二叉树的转换,而且可以在程序设计中调用使用。学生要认真完成能够实现题目要求的函数库。由于二叉树和树都可以使用二叉链表作为存储结构,则二叉链表作为媒介可导出树与二叉树之间的一个对应关系。给定一棵树,可以找到唯一的一棵二叉树与之对应。2.2 存储结构设计(1)设置头文件:#include#include#include(2)设置常量:#define MAX_TREE_SIZE 100(3)一般树的存储结构有以下几种:双亲结点,孩子结点,孩子兄弟结点,本实验运用到的是双亲结点和孩子兄弟结点,具体存储结构如下:Typedef structint data,parent/双亲位置域;PTNode;双亲表示法树结构:Typedef structPTNode nodeMAX_TREE_SIZE;int count;PTree;树的孩子兄弟结点表示结点结构定义:Typedef struct node int data; struct node *firstchild;struct node *rightsib;BTNode,*BTree;2.3 算法描述按照程序执行先后顺序进行描述(1)树的构建完成后,用孩子兄弟表示法对树进行初始化结点,所用到的方法是:BTNode GetTreeNode(int x) BTNode t;t.data =x;t.firstchild =t.rightsib =NULL;return t;(2)树创建成功后,进行树的先序遍历,如果树不为空,先访问根结点,再先序遍历左子树,然后先序遍历右子树。先序遍历二叉树基本操作方法是递归算法,使用的方法是:void preorder(BTNode *T) if(T!=NULL)preorder(T-firstchild );preorder(T-rightsib );(3)树的后序遍历中,如果树不为空,首先后序遍历左子树,再后序遍历右子树,然后访问根结点,使用的方法是:void inoeder(BTNode *T) int i;for(;i=T.count-1;i-)printf(%d,T.nodei);(4)树的层次遍历,如果二叉树非空,将根指针入队进行循环,直到队列为空,其方法是:void level(PTree T) int i;for(i=0;iT.count;i+)printf(%d,T.nodei);(5)用双亲表示法表示树,创建一维数组表示法,数组的元素具有两个数据域data和双亲位置域parent,每一个元素对应一个数组下标,其方法是:PTree CreatTree(PTree T) int i=1;int fa,ch;PTNode p;for(i=1;ch!=-1;i+)T.count+;T.nodeT.count.data=p.data;T.nodeT.count.parent=p.parent;(6)实现一般树转换成二叉树,树中的每个结点最多只有一个最左边的孩子和一个右邻的兄弟,每个结点的兄弟指针指向它的一个兄弟,每个结点仅有一个孩子指针,让它指向自己最左边的孩子,这样就可以呈现出一棵二叉树,其方法是:BTNode *change(PTree T) int i,j=0;BTNode pMAX_TREE_SIZE;BTNode *ip,*is,*ir,*Tree;ip=(BTNode*)malloc(sizeof(BTNode);is=(BTNode*)malloc(sizeof(BTNode);Tree=(BTNode*)malloc(sizeof(BTNode);Tree=&p0;return Tree;(7)实现调用功能的主函数,可以实现对一般树的转换,进行先序遍历、后序遍历、层次遍历、水平输出二叉树、返回主菜单以及退出程序等功能,方法是:void main()int i=0,c1,c2;PTree T;BTNode *Tree;init_ptree(&T);loop:Menu();scanf(%d,&c1);switch(c1)case 1:case 2:Menu2();scanf(%d,&c2);if(c2=9)goto loop;else if(c2=0)exit(1);最后进行调试和修改,进行执行操作。2.4 程序流程图(表2.1树与二叉树转换的实现程序流程图)3 程序清单#include #include #include #define MAX_TREE_SIZE 100/树的双亲表示结点结构定义typedef structint data;int parent;/双亲位置域PTNode;/双亲表示法树结构typedef structPTNode nodeMAX_TREE_SIZE;int count;/根的位置和结点个数PTree;/树的孩子兄弟表示结点结构定义typedef struct nodeint data;struct node *firstchild;struct node *rightsib;BTNode,*BTree;void init_ptree(PTree *tree)tree-count =-1; /初始化树结点(孩子兄弟表示法)BTNode GetTreeNode(int x)BTNode t;t.data =x;t.firstchild =t.rightsib =NULL;return t;/树的先序遍历(递归)void preorder(BTNode *T)if(T!=NULL)printf(%d,T-data );preorder(T-firstchild );preorder(T-rightsib );/树的先序遍历(非递归)void preorder2(PTree T)int i;for(i=0;ifirstchild);printf(%d,T-data);inoeder(T-rightsib );/树的后序遍历void inoeder2(PTree T)int i;for(;i=T.count-1;i-)printf(%d,T.nodei);/层次遍历void level(PTree T)int i;for(i=0;irightsib,level+1);for(i=1;idata);PrintBTree(root-firstchild,level+1);/输出树void print_ptree(PTree tree)int i;printf( 序号 结点 双亲n);for(i=0;i=tree.count;i+)printf(%8d%8d%8d,i,tree.nodei.data,tree.nodei.parent);printf(n);/用双亲表示法表示树 PTree CreatTree(PTree T)int i=1;int fa,ch;PTNode p;for(i=1;ch!=-1;i+)printf(输入第%d个结点n,i);scanf(%d%d,&fa,&ch);printf(n);p.data=ch;p.parent=fa;T.count+;T.nodeT.count.data=p.data;T.nodeT.count.parent=p.parent;printf(n);printf(创建的树具体情况如下:n);print_ptree(T);return T;/一般树转换成二叉树BTNode *change(PTree T)int i,j=0;BTNode pMAX_TREE_SIZE;BTNode *ip,*is,*ir,*Tree;ip=(BTNode*)malloc(sizeof(BTNode);is=(BTNode*)malloc(sizeof(BTNode);Tree=(BTNode*)malloc(sizeof(BTNode);for(i=0;iT.count;i+)pi=GetTreeNode(T.nodei.data);for(i=1;idata)j+;is=&pj;if(!(is-firstchild)is-firstchild=ip;ir=ip;elseir-rightsib=ip;ir=ip;Tree=&p0;return Tree;/主菜单void Menu()printf(=主菜单=n);printf(*输入1-以双亲法创建一般树 *n);printf(*输入2-树的先序遍历(递 归)*n);printf(*输入3-树的后序遍历(递 归)*n);printf(*输入4-树的先序遍历(非递归)*n);printf(*输入5-树的后序遍历(非递归)*n);printf(*输入6-层次序的非递归遍历 *n);printf(*输入0-退出程序 *n);printf(=请输入执行的指令=n);/副菜单void Menu2()printf(=副菜单=n);printf(*输入9-返回菜单继续工作 *n);printf(*输入0-退出程序 *n);/主函数void main()int i=0,c1,c2;PTree T;BTNode *Tree;init_ptree(&T);loop:Menu();scanf(%d,&c1);switch(c1)case 1:printf(建立一般树,依次输入各个结点情况:n);printf(输入结点方式:双亲数据,整型数据(第一个结点双亲数据为-1,最后以-1,-1结束)n);T=CreatTree(T);Tree=change(T);printf(一般树转换成二叉树后的情况n);PrintBTree(Tree,i);getchar();break;case 2:printf(树的先序遍历(递归):n);preorder(Tree);printf(n);break;case 3:printf(树的后序遍历(递归):n);inoeder(Tree);printf(n);break;case 4:printf(树的先序遍历(非递归):n);preorder2(T);printf(n);break;case 5:printf(树的后序遍历(非递归):n);inoeder2(T);printf(n);break;case 6:printf(树的层次遍历:n);level(T);printf(n);break;case 0:exit(1);break;Menu2();scanf(%d,&c2);if(c2=9)goto loop;else if(c2=0)exit(1);4 测试4.1 测试数据(1) 运行前面提到的程序后,会在计算机窗口显示出程序所涉及的操作流程“主菜单”。其内部包含用双亲法创建一般树、树的先序遍历等操作功能,如下图所示。(图4.1 主菜单)(2)按照操作提示,首先输入1建立一般树,然后根据窗口提示一次输入各个结点(示例是依次输入-1,1;1,2;1,3;2,4和-1,-1),工作平台会显示出下图所示的操作过程。 (图4.2 示例操作数据)(3)输入上述所提供的示例之后,该程序会在工作平台显示运行结果,自动生成一般树,并且输出树的具体情况(包括序号、结点和双亲)。在建立好一般树之后,系统会自动把它转化为二叉树,并输出新形成的树的具体情况。同时,程序主函数内部的“副菜单”也会被调用(如下图所示),从而显示出来供操作者根据自身情况进行操作。 (图4.3 树与二叉树的转换)(4)当进行完以上操作后,按照提示输入9后会重新显示一个如图4.1.1所示的主菜单,然后输入3(此为示例操作),会自动调用“树的后序遍历(递归)”方法,在工作平台上显示此树的后序遍历结果,具体情形如下图所示。(图4.4 树的后序遍历)4.2 测试结果分析输出树中的“printf(,i,)”(图4.5测试结果)5 课程设计体会通过本次课程设计,我发现,有关一个课题的所有知识不仅仅是在课本上,多查阅一些资料能够更好的完成课题,这就需要一种能力,即自学能力。本次课程设计还让我认识到自己的缺点。本次选的课题是二叉树的遍历,因为本学期所学的就是二叉树等数据结构,所以认为比较适合。刚开始认为会很简单,但到后来就出现一些难以解决的问题,就像老师请教,并查阅相关资料。经过慢慢的调试,最终测试成功。这次课程设计让我所学到了许多数据结构知识,而且还拓展了我的知识面,使我更加熟练的掌握各种方法。总之,这次课程设计增强了我的自学能力,拓展了我的知识面,让我对数据结构更加了解。 参考文献1朱战立.数据结构使用C语言(第四版)电子工业出版社20092周海英.马巧梅数据结构与算法设计(第二版)国际工业出版社20053吴跃.数据结构和算法机械工业出版社20104严蔚敏.吴伟民数据结构:C语言版清华大学出版社20075刘振宇.数据结构(C语言版).东软电子出版社#include#include#include#define MAX_TREE_SIZE 100/-树的双亲表存储结构typedef struct PTNode/结点结构int data;int parent; /双亲位置域PTNode;/树的双亲表示结点的结构定义typedef struct PTree/树结构PTNode node MAX_TREE_SIZE;int count;/根的位置和结点数PTree;/双亲表示树的结构typedef struct nodeint data;struct node * firstchild;struct node * rightsib;BTNode,* BTree;/树的孩子兄弟表示结构结点的定义void init_ptree(PTree * tree)tree-count=-1;/树的初始化(双亲)BTNode GetTreeNode(int x)BTNode t;t.data=x;t.firstchild=t.rightsib=NULL;return t;/树结点的初始化(孩子兄弟)void preorder(BTNode * T)if(T!=NULL)printf(%d,T-data);preorder(T-firstchild); preorder(T-rightsib);/树的前序遍历(递归)void preorder2(PTree T)int i;for(i=0;ifirstchild);printf(%d,T-data); inorder(T-rightsib);/树后续的遍历(递归)void inorder2(PTree T)int i;for(i=T.count-1;i=0;i-)printf(%d,T.nodei);/树的后序遍历(非递归)void level(PTree T)int i;for(i=0;irightsib,level+1);for(i=1;idata);PrintBTree(root-firstchild,level+1);/水平输出二叉树void print_ptree(PTree tree)int i;printf( 序号 结点 双亲n);for(i=0;i=tree.count;i+)printf(%8d%8d%8d,i,tree.nodei.data,tree.nodei.parent);printf(n);/输出树PTree CreatTree(PTree T)int i=1;int fa,ch;PTNode p;for(i=1;ch!=-1;i+)printf(请输入第%d结点:n,i);scanf(%d,%d,&fa,&ch);printf(n);p.data=ch;p.parent=fa;T.count+;T.nodeT.count.data=p.data;T.nodeT.count.parent=p.parent;printf(n);printf(创建的树具体如下:n);print_ptree(T);return T;/用双亲法表示树BTNode * change(PTree T)int i,j=0;BTNode pMAX_TREE_SIZE;BTNode *ip,*is,*ir,*Tree;ip=(BTNode *)malloc(sizeof(BTNode);is=(BTNode *)malloc(sizeof(BTNode);ir=(BTNode *)malloc(sizeof(BTNode);Tree=(BTNode *)malloc(sizeof(BTNode);for(i=0;iT.count;i+)pi=GetTreeNode(T.nodei.data); for(i=1;idata)j+;is=&pj;if(!(is-firstchild)is-firstchild=ip;ir=ip;Tree=&p0;return Tree;/一般树转换成二叉树void Menu()printf( 主菜单 n);printf(输入1 以双亲法创建一棵一般树 n);pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纵隔肿瘤麻醉注意事项
- 2025年千锋java面试题及答案
- 控感基础培训
- 防疫招聘面试题及答案
- 理科组合试题及答案
- 红旗公司面试题及答案
- 2025年量子计算技术在金融风险模拟中的实时监测与预警报告
- 低碳城市新路径:2025年聊城规划与实践案例分析
- 深度分析:2025年数控机床智能化升级的技术挑战与解决方案报告
- 2025年高纯四氧化三锰项目立项申请报告模范
- 《无衣》教学设计 统编版高中语文选择性必修上册
- 合肥市住宅小区物业服务等级标准
- 创造心智与创新训练智慧树知到期末考试答案2024年
- 食品厂员工卫生培训方案
- 危房改造工程投标方案(技术标)
- 北京市西城区2022年五年级下册《数学》期末试卷与参考答案
- (完整)大体积混凝土测温记录表
- 国开电大本科《中国法律史》在线形考(任务一至十二)试题及答案
- 提高住院病历完成及时性持续改进(PDCA)
- 山东省济宁市兖州区2022-2023学年八年级下学期期末数学试题(含答案)
- 加强中小学生作业管理完整PPT
评论
0/150
提交评论