华中科技大学软件课程设计报告(共25页).doc
《华中科技大学软件课程设计报告(共25页).doc》由会员分享,可在线阅读,更多相关《华中科技大学软件课程设计报告(共25页).doc(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上软件课程设计报告班 级: 光 电 1006姓 名: 陈 光 辉学 号: U目录5 6 1.软件设计1.1 设计目的继续巩固C语言的基础,其中需要熟练掌握的有函数变量、程序控制、输入输出、调试环境、结构体等。熟练运用C语言的知识实现有序二叉树的建立、查找和打印;了解非线性数据结构,并且掌握二叉树的三种遍历方式:先序遍历、中序遍历和后序遍历,并编程实践它们的实现、应用方法。1.2 设计要求(1)学习结构体、链表等数据结构,以及查找、选择排序等基本算法,结合指针,文件等相关知识进行简单界面设计,能够实现友好的交互;(2)读懂源程序(用链式结构实现二叉树的建立、查询和打印),
2、为程序写出注释,并画出程序的流程图;(3)将程序输入计算机,编译、连接并运行;(4)编写二叉排序树的前序遍历程序、中序遍历程序和后序遍历程序。1.3 二叉树(1).定义.树(tree):树是由n(n0)个结点组成的有限集合。对于n=0的树称为空树,对于n0的任意一棵非空树,有一个特殊的结点称为根结点(root),根结点没有前趋结点;剩下的结点被分成n=0个互不相交的集合T1、T2、.Tn,而且, 这些集合的每一个又都是树。树T1、T2、.Tn被称作根的子树(Subtree)。.二叉树是指树的深度为2的有序树;它是一棵由一个根结点(root)与两棵互不相交的分别被称为左子树和右子树所组成的非空树
3、,左子树和右子树又同样都是一棵二叉树。这是二叉树的递归定义。二叉树可以是空集合,根可以有空的左子树或空的右子树。二叉树是一种最简单、最重要的树,在计算机领域有着广泛的应用。.表示方法:通常用一个圆圈表示一个结点,并在圆圈中标一个字母,或一个数字,或一个字符串,作为结点的名字或结点值,以区别不同的结点。在根结点与它的子树的根结点之间加一条连线,表示它们之间的逻辑关系。如下图表示:这是一个满二叉树用结构体表示二叉树,如下表:左节点右节点数据编程时二叉树的定义方法是,先定义一个结构体 struct treechar info;/字符变量info,用于保存数据struct tree *left, *r
4、ight;/定义子树和右子树指针(2).二叉树的存储结构.数据结构的定义:数据结构由某一数据元素及该集合中所有数据元素之间的关系组成。包括数据的逻辑结构、数据的存储结构和对数据的操作。数据结构的形式定义为:数据结构是一个二元组。记为:Data_Structure=(D,S)二叉树是基本数据结构之一,在数据操作方面具有一定优势。.存储结构:包括顺序存储和链式存储。.顺序存储:通常用于存储具有线性结构的数据。将逻辑上相邻的结点存储在连续存储区域M的相邻的存储单元中,使得逻辑相邻的结点一定是物理位置相邻。.链式存储:在结点的存储结构中附加指针字段来存储结点间的逻辑关系。链接法中数据结点包括两部分:数
5、据字段存放结点本身的数据,指针字段存放指向其后继结点的指针。链接方法适用于那些需要经常进行增删结点的复杂数据结构。对于一般的二叉树,采用的是链式存储结构,其形式定义为:TypedefstructBTnode Elementtype data;StructBTnode *LChild ;StructBTnode *RChild ; *BTree ;BTree BT ; /BT指向二叉树的根结点(3).二叉树的遍历遍历:是指按照某种顺序访问二叉树中的所有结点,使得二叉树中的每个结点被访问一次而且仅被访问一次。 先序遍历:若二叉树为空,则遍历结束,否则:a) 访问根结点;b) 先序遍历左子树;c)
6、先序遍历右子树。先序遍历的程序如下:void xianxu(struct tree *root) if(root=NULL) /指针为空,则提示二叉树为空 printf(这是一个空的二叉树!n); return; else printf(%c,root-info); / 前序遍历:先是根结点 if(root-left!=NULL) xianxu(root-left); /递归访问左结点 if(root-right!=NULL) xianxu(root-right); /递归访问右结点 .中序遍历:若二叉树为空,则遍历结束,否则:a) 中序遍历左子树;b) 访问根结点;c) 中序遍历右子树。中序
7、遍历的程序如下:void zhongxu(struct tree *root) if(root=NULL) printf(这是一个空的二叉树!n); /指针为空,则提示二叉树为空 return; else if(root-left!=NULL) zhongxu(root-left); /中序遍历:递归先访问左结点 printf(%c,root-info); /然后父结点 if(root-right!=NULL) zhongxu(root-right); /最后递归访问右结点 .后序遍历:若二叉树为空,则遍历结束,否则:a) 后序遍历左子树;b) 后序遍历右子树;c) 访问根结点。后序遍历的程序
8、如下:void houxu(struct tree *root) if(root=NULL) printf(这是一个空的二叉树!n); /指针为空,则提示二叉树为空 return; else if(root-left!=NULL) /后序遍历:首先递归访问左结点 houxu(root-left); if(root-right!=NULL) /然后递归访问右结点 houxu(root-right); printf(%c,root-info); /最后父结点1.4 程序分析(1)程序结构程序由7个部分构成: 定义结构指针变量创建二叉树struct tree *create_btree(struct
9、 tree *root,struct tree *r,char info) 定义结构指针变量查找二叉树struct tree *search_btree(struct tree *root,char key); 打印二叉树函数void print_btree(struct tree *r,int l); 前序遍历程序void xianxu(struct tree *root); 中序遍历程序void zhongxu(struct tree *root); 后序遍历程序void houxu(struct tree *root); 还有就是主程序,调用上述函数来实现二叉树的创建、查找、打印以及遍历
10、(2)程序功能 用链式结构实现二叉树的建立、查询和打印,编写二叉树的前序遍历程序、中序遍历程序和后序遍历程序实现对二叉树的访问。附加的功能还有,比如弄够对输入的结点进行计数。 而且此程序加入了很多人性化的界面,有很多人机交互的内容,系统用户进入界面控制后,对不同的功能操作提示不同,更加方便操作。(3).程序注释 程序的注释在后面的程序附录有详细的描述1.5 程序流程图开始(1)主程序的流程图如下:定义字符数组接收数据空格作为输入结束标志提示输入输入字符二叉树是否建立是否建立根结点并保存数据继续创建新的子树否输入数据是否为空是调用函数打印新建的二叉树提示输入要查找的数据提示继续查找调用函数查寻输
11、入的数据Key是否为真结束(2)二叉树的创建流程图如下:开始r=0 否 是开辟内存是否小于当前结点的左结点新插入的结点为空提示:Out of memory是左右结点的初始化,并将r置于根结点处插入右结点插入左结点父结点是否建立 否是新结点是否在左结点之前r的左右结点赋初值否 是将其值赋给右结点将其值赋给左结点返回新建的结点结束(3)二叉树的查找流程图如下:开始提示Empty btree二叉树是否为空是 否当前接点不是要查找要查找的接点是否小于当前左结点否是左结点的首地址赋给root赋给root右结点的首地址赋给root是否查找到结点是提示查找成功否提示查找失败返回首地址结束(4)二叉树打印的流
12、程图如下:开始定义整型变量,表示当前结点的高度指针为空是 否递归打印二叉树的左结点返回是否小于结点的高度打印二叉树的根结点是打印l*2个空格递归打印二叉树的右结点结束2.软件测试1.2 测试环境程序是在开发软件Microsoft Visual C+上运行调试的。(1).源程序的测试:二叉树的建立、查询和打印的源程序在VC中运行后的结果是:但是在这过程中,我发现当你输入比上次结点深度更浅的结点进行再次查找时,就会出现查找失败的现象。(2).加入三种遍历程序在主程序中运行后,可以选择遍历方式。如下图所示,输入一个简单的二叉树后前序遍历的结果是:(3).友好界面程序中加入了很多人机交互的内容,在进入
13、操作界面后,对于不同的指令有不同的提示例如:3 算法改进问题一:在二叉树的查找程序中,输入第一个数据时可以成功查找,而且依次输入深度更深的结点进行查找时也可成功,但是如果查找的结点比当前结点的深度要浅,比如是其父结点,这是就会提示Empty btree或者Search Failure。问题二: 在三种遍历程序中,当输入的结点为零时,就会提示二叉树为空。但是后来发现当指针为空时依然出现一个没有结果的遍历。比如下图,选择中序遍历时没有显示问题三:在选择遍历方式时,我定义的是一个int 的变量i,而且选择1,2,3,之外的选项时回报错并提示你重新选择。但是当输入的选项不是整型数值而是字母是,就意外的
14、发现程序进入了一个死循环,如下图所示: 问题四:为了给程序加一个出口,我在查询的时候加一个人机交互的界面。当不继续查找结点时就会退出程序。修改以后,虽然选择没有问题,但是发现计算机在进入这个界面时总是会自动先选择,从而总会有一个报错的提示!问题一的解决方案 方案一:仔细分析源程序,问题是在选择排序查找时,把每次比较的第一个数据的首地址赋给结构体指针变量struct tree *root,所以每比较一次指针向后移动一位,而二叉树的遍历是每次访问并且仅访问一次,当再来查找前面的结点时就无法访问了。对此,我首先想到的方案是在建立程序内再定义一个指针变量,用于把比较的第一个数据首地址赋给它。代码如下:
15、struct tree *search_btree(struct tree *root,char key) struct tree *r; r=root;if (!r) printf(Empty btreen); return root; while(root-info!=key) if(keyinfo) r=root-left; else r=root-right; if(r=0) printf(Search Failuren); break ; if (r !=0) printf(Successful searchn key=%cn,r-info); return root ; 但是并没有
16、达到预期结果结果。后来在同学的提示下,我发现这个方案并不可取。因为,新定义的指针在选择比较的过程中也会每次指向下一位数据。 方案二:在主程序中,在查找的循环内,把root=search_btree(root,c);改为search_btree(root,c);, 改进的代码如下所示: while (key) /查找指定值的结点printf(Enter a key to find:); /输入要查找的数据scanf(%s,&c);search_btree(root,c); /查寻输入的数据printf(press to continuen); 这样没有把要查找的数据地址赋给root指针,指针变量
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华中科技大学 软件 课程设计 报告 25
限制150内