数据结构课程设计1.docx
- 文档编号:8326201
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:23
- 大小:362.46KB
数据结构课程设计1.docx
《数据结构课程设计1.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计1.docx(23页珍藏版)》请在冰豆网上搜索。
数据结构课程设计1
长沙理工大学
《数据结构》课程设计报告
学院计算机与通信工程专业网络工程
班级学号
学生姓名指导教师陈倩诒
课程成绩完成日期2013年7月10日
课程设计任务书
计算机与通信工程学院网络工程专业
课程名称
数据结构课程设计
时间
2012~2013学年第2学期19~20周
学生姓名
指导老师
陈倩诒
题目
中序线索化二叉树及遍历
主要内容:
研究中序线索化二叉树的生成算法,并用二叉链表来存储数据,在此基础上,实现对中序线索化二叉树的遍历及查找某个节点的直接前驱和直接后继。
要求:
(1)通过实际项目的分析、设计、编码、测试等工作,掌握用C语言来开发和维护软件。
(2)按要求编写课程设计报告书,能正确编写分析、设计、编码、测试等技术文档和用户使用手册。
应当提交的文件:
(1)课程设计学年论文。
(2)课程设计附件(主要是源程序)。
课程设计成绩评定
学院计算机与通信工程专业网络工程
班级学号
学生姓名指导教师陈倩诒
完成日期2013年7月10日
指导教师对学生在课程设计中的评价
评分项目
优
良
中
及格
不及格
课程设计中的创造性成果
学生掌握课程内容的程度
课程设计完成情况
课程设计动手能力
文字表达
学习态度
规范要求
课程设计论文的质量
指导教师对课程设计的评定意见
综合成绩指导教师签字年月日
中序线索化二叉树及遍历
学生姓名:
指导老师:
陈倩诒
摘要该课程设计研究中序线索化二叉树的建立及其相关的操作。
线索化二叉树是在二叉树基础上加上两个左右标志位,通过其值来标记该节点是有左右孩子还是前驱或后继节点,利用二叉链表实现中序线索化二叉树的存储,空间的每个结点内有左、右子树节点和左右标志位。
关键字中序线索化二叉树;线索化二叉树;前驱节点;后继节点
目录
1引言
1.1课程设计的目的…………………………………………………………1
1.2课程设计的内容…………………………………………………………2
1.3课程设计的目标…………………………………………………………2
2设计内容
2.1问题描述…………………………………………………………………3
2.2思路分析…………………………………………………………………3
2.3过程演示…………………………………………………………………4
2.4数据测试…………………………………………………………………5
3算法分析及详细实现
3.1算法分析…………………………………………………………………6
3.2算法中用到的函数声明…………………………………………………6
3.3部分程序编写……………………………………………………………7
4程序运行结果及运行环境
4.1程序运行的环境…………………………………………………………10
4.2运行结果…………………………………………………………………10
5总结
5.1课程设计总结……………………………………………………………13
5.2心得体会…………………………………………………………………13
参考文献…………………………………………………………………………14
附录程序清单…………………………………………………………………15
1引言
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
数据结构是学习计算机相关专业的非常重要的知识,所谓结构就是组织形式,数据的结构就是数据怎么组织,即怎么描述,怎么在电脑中存储。
不同类型的数据,它们的组织形式(数据结构)是不同的,在程序设计中,除了应精心设计算法外,还应精心组织数据(包括原始数据、中间结果、最终结果),使之形成一定的组织形式(数据结构),以便让计算机尽可能高效率地处理。
《数据结构》是计算机科学与工程的基础研究之一,掌握该领域的知识对于我们进一步进行高效率的计算机程序开发非常重要。
无论在哪个国家,《数据结构》都是大学的计算机专业重要的专业基础课。
数据结构的课程设计要求学生熟练掌握数据结构的逻辑特性和物理表示,具有分析问题的能力,可以根据问题选择合适的数据结构,运用该数据结构结合相应的算法解决实际问题。
1.1课程设计的目的
为了更好的学习数据结构,深刻理解数据结构在解决实际问题中的应用,体会其重要性,熟练掌握线性表、栈和队列、串、数组、树、图等常用的数据结构,熟悉各自的特点和应用场合。
同时锻炼自己独立分析理解问题的能力,学会根据不同的问题选择合适的数据结构,然后结合适当的算法解决问题。
锻炼自己的设计和编写程序的技巧,进一步调试和测试自己所写的程序,使其功能更加完善,养成较好的编写程序习惯。
提高综合运用所学的理论知识和方法独立分析和解决问题的能力[1],训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能[2]。
1.2课程设计的内容
该课程设计的内容是中序线索化二叉树的建立及相关操作[3]。
用户进入后,根据提示先序创建二叉树,并且如果是空节点的话,要输入字符“#”,成功创建二叉树[4],利用二叉链表存储二叉树,然后,再根据提示选择相应的序号,可以进行中序线索化二叉树创建、遍历及搜索等操作。
1.3课程设计的目标
通过该课程设计,更加熟练的掌握二叉链表、用二叉链表实现建二叉树以及创建、遍历中序线索化二叉树的过程。
完成建线索化二叉树的函数、对中序线索化二叉树遍历的函数、按值搜索二叉树节点的函数、查找节点前驱和后继的函数及其他显示函数和主函数。
2设计内容
2.1问题描述
中序线索化二叉树是在二叉树的基础上,添加了两个标志位,来标志该节点是有孩子树,还是有前驱或后继节点。
在查找某一节点的直接前驱或后继节点时,先按值遍历中序线索化二叉树找到与值相同的节点,然后再调用查找前驱和后继的函数来找到该节点的直接前驱和后继节点。
本课程设计的主要问题是中序线索化二叉树的遍历及查找节点的直接前驱和后继节点。
2.2思路分析
首先要建线索二叉树,根据所学数据结构的知识,线索二叉树就采用二叉链表来存放,该二叉链表的数据结构应该包括结点的数据域,左、右孩子结点的指针域,还有左右孩子的标志位。
然后,对该二叉树进行中序线索化的过程就是在中序遍历过程中对其进行线索化。
还有要查找某一节点的前驱和后继节点,必须先知道该节点的值,然后根据值找到该节点,这样才能找到其前驱和后继节点,最后将字符显示出来即可。
2.3过程演示
该部分给出了算法执行的流程,如图2.1所示。
图2.1算法流程图
2.4数据测试
编写好程序后测试是重要的一步,也是检验算法是否成功的一种方式。
测试的数据应该具有普遍性,代表性以此来保证程序的严谨性和正确性。
所以该程序的测试数据选用了下列数据的测试
数据测试结果如下:
第一组:
先序二叉树:
ABD##E##C#F##
中序线索二叉树的遍历:
D->B
B->E->A
A->C->F->
查找节点E的前驱:
B,后继:
A
第二组:
先序二叉树:
ABD##E##C#F##
中序线索二叉树的遍历:
D->B
B->E->A
A->C->F->
查找节点B的前驱:
D,后继:
E
3算法分析及详细实现
3.1算法分析
该中序线索化二叉树的课程设计中包括很多算法,但是最主要的就包括三个重要的算法:
建中序线索化二叉树、遍历算法、查找节点前驱和后继算法。
具体的算法分析如下:
(1)建中序线索化二叉树算法
用一个二叉链表存储线索二叉树,在对线索二叉树进行中序遍历的过程中对其进行线索化,即可完成中序线索化二叉树的建立。
(2)遍历算法
该函数是在中序线索化二叉树建立的情况下,对其进行中序遍历,打印出相应节点的值。
(3)查找节点前驱和后继算法
前驱算法:
如果该节点无左子树,那么它的左标志LTag值为1,则其左孩子节点指针域lchild所指向的节点便是它的直接前驱。
如果该节点有左子树,那么它的左标志LTag值为0,则其左孩子节点指针域lchild所指向的节点是它的左孩子节点。
按中序遍历可知,该节点的直接前驱应该是以其左孩子节点为根节点的子树的最右节点,也就是要找的直接前驱。
后继算法:
该函数与前驱算法大致相同,不过是将前驱算法中的LTag、lchild改为对应的RTag、rchild,此外,后继寻找的是左节点。
3.2算法中用到的函数声明
在该程序中用到了很多函数,有一部分是系统提供的如字符串拷贝函数,动态分配内存空间函数等,剩下更多的是自己调用系统函数所写的函数,具体声明如表3-1所示。
表3-1函数声明表
BiThrTreeCreateBiTree()
先序创建二叉树
boolInOrderThreading(BiThrTree&Thrt,BiThrTreeT)
对创建的二叉树进行线索化
voidInThreading(BiThrTreep)
在对线索化二叉树中序遍历过程中,将其中序线索化
voidInOrderTraverse_Thr(BiThrTreeThrt)
中序遍历二叉树,Thrt为头节点
BiThrTreeInpre(BiThrTreep)
在中序线索二叉树上寻找节点p的中序直接前驱
BiThrTreeInsub(BiThrTreep)
在中序线索二叉树上寻找节点p的中序直接后继
BiThrTreeLocate(BiThrTreeH,chare)
在以H为头节点的中序线索二叉树中查找值为e的节点
BiThrTreeLocate(BiThrTreeH,chare)
在以H为头节点的中序线索二叉树中查找值为e的节点
show()
首页
menu_select()
选择菜单
main()
主函数
3.3部分程序编写
该课程设计的部分代码如下:
/*
*InThreading(BiThrTreep)
*功能:
将二叉树进行中序线索化
*p:
节点p
*pre:
全局变量,刚刚访问过的结点
*lchild:
左子树指针域
*rchild:
右子树指针域
*RTag,LTag:
右、左标志位
*/
voidInThreading(BiThrTreep){//中序遍历过程中进行中序线索化
if(p){
InThreading(p->lchild);//左子树线索化
if(!
p->lchild){//建立p的直接前驱线索
p->lchild=pre;
p->LTag=1;
}
if(!
pre->rchild){//建立pre的直接后继线索
pre->rchild=p;
pre->RTag=1;
}
pre=p;//确保pre恒指向直接前驱
InThreading(p->rchild);//右子树线索化
}
}
/*
*Inpre(BiThrTreep)
*功能:
查找节点P的前驱节点
*p:
节点p
*pre:
全局变量,刚刚访问过的结点
*lchild:
左子树指针域
*rchild:
右子树指针域
*RTag,LTag:
右、左标志位
*/
BiThrTreeInpre(BiThrTreep){/*在中序线索二叉树上寻找节点p的中序直接前驱*/
BiThrTreepre;
pre=p->lchild;
if(p->LTag!
=1)//左子树存在
while(pre->RTag==0)
pre=pre->rchild;//寻找最右节点
returnpre;
}
/*
*Locate(BiThrTreeH,chare)
*功能:
按值e查找节点
*p:
节点p
*H:
头节点H
*lchild:
左子树指针域
*LTag:
右、左标志位
*/
BiThrTreeLocate(BiThrTreeH,chare){
/*在以H为头节点的中序线索二叉树中查找值为e的节点*/
BiThrTreep;
p=H->lchild;
while(p->LTag==0&&p!
=H)
p=p->lchild;//找到遍历的第一个节点
while(p!
=H&&p->data!
=e)
p=Insub(p);//查找后继节点
if(p==H){
printf("没有该节点!
");
return0;
}
else
returnp;
}
4程序的运行环境及运行结果
4.1程序运行的环境
一个程序需要一个良好的环境才能运行,该课程设计中的程序运行的硬件、软件环境如下。
(1)硬件环境
1)学生用微机
2)实验楼机房
3)局域网
(2)软件环境
1)Windows7旗舰版系统
2)VC++6.0
4.2运行结果
本程序只需根据提示输入相应的数据即可。
show()执行结果如图4.1所示。
图4.1程序首页图
按任意键进行清屏,进入算法。
会提示用户先序创建二叉树。
具体输入的结果如图4.2所示。
图4.2二叉树输入结果图
接下来就是输入相关序号进行各种操作,如图4.3所示。
图4.3程序执行结果图
5总结
5.1课程设计总结
课程设计可以检验学生对知识的掌握程度。
同时更反映了一个学生对课程设计的态度,对待任何事都要认真,可以不会,可以做的不是最好的,但是一定要尽自己最大的努力去完成一件哪怕再小的事。
在这次课程设计中学到了很多新的知识,同时也巩固了之前学过的知识。
对二叉链表有了更深的理解,对中序线索化二叉树的印象更是深刻。
虽然,最后根据要求完成了任务,但期间还是出现了种种的问题,比如在编写完函数时,运行结果总是出错,运行中断,结果未能显示出来,调试了好多遍,也没有发现错误,没有想到是犯了一个低级的错误,在输出数值的时候,printf函数式中,忘加了“%c”,导致结果一直没有显示出来,还有一些是传值的时候出现了问题。
同时,为了更好的完成任务还上网查阅了好多资料,不懂的就到处搜索,去图书馆借相应的书籍来看,锻炼了自己查阅资料的能力。
5.2心得与体会
真心的感谢陈倩诒老师对我们认真耐心的辅导,尤其是我,感受颇深。
陈老师耐心对待、解答每个学生的问题,认真看学生的程序,努力帮助每个学生把程序搞定,还积极引导学生思考,来发动我们自己动手和思考。
此外,老师很随和,和蔼可亲,平易近人,没有其他老师的那种架子,深受学生喜欢。
通过这次课程设计学到了很多课本上没有的知识,但是我觉得更重要的是从中学到一些道理。
再细微的事也不能够疏忽,每一步都要仔细对待,认真思考,要懂得千里之堤毁于蚁穴的道理;遇到困难也不要退缩,我相信有困难才会有进步,所以遇到困难就去解决困难,不要畏惧。
凡事都会有解决的办法,现在的网络这么便利,想查什么资料都可以找的到,图书馆的书也很多很方便,总会找到办法解决问题。
同时,对待一件事情的态度很重要,只要你足够重视一件事,就一定会把它做好,虽然不是最好但是尽了自己最大的努力,这样就够了。
其实,越长大越觉得态度很重要,很多人不是看你有多么厉害,你可以什么都不会但是只要你态度够认真,别人也一样的重视你,态度认真了,做事就会更加有目的性,更虚心求教,进步也就更快。
所以,我以后要养成良好的习惯,做事要认真,要仔细,再小的细节也不放过。
参考文献
[1]严蔚敏,吴伟民.数据结构.C语言版.北京:
清华大学出版社,2011
[2]李春葆,尹为民.数据结构教程上机指导.第三版.北京:
清华大学出版社,2008
[3]吴文虎.程序设计基础.北京:
清华大学出版社,2003
[4]AndrewBinstockandJohnRex.陈宗斌.程序员实用算法(原书第二版).机械工业出版社,2009
附件
程序清单
/*
*数据结构课程设计
*课题:
中序线索化二叉树及遍历
*作者:
网络1101班201158080125万志军
*指导教师:
陈倩诒
*
*结构体的定义:
线索二叉树的结构
*/
//----------------------------------有关结构定义----------------------------------
#include
#include
#include
#include
typedefstructBiThrNode{//线索二叉树中结点的定义
chardata;
intLTag,RTag;//线索左右标志
structBiThrNode*lchild,*rchild;//左右孩子
}BiThrNode,*BiThrTree;
//----------------------------------先序构建二叉树--------------------------------
BiThrTreeCreateBiTree(){
charch;
BiThrTreeT;
scanf("%c",&ch);//从键盘输入ch;
if(ch=='#')
T=NULL;//如果ch='#',则T为空指针
else{
if(!
(T=(BiThrNode*)malloc(sizeof(BiThrNode))))return0;//申请内置空间
T->data=ch;
T->LTag=0;//线索标志赋初值0
T->RTag=0;//线索标志赋初值0
T->lchild=CreateBiTree();//先序建立T->lchild;
T->rchild=CreateBiTree();//先序建立T->rchild;
}
returnT;//返回树结点头指针
}//CreateBiTree()
//----------------------------线索化二叉树---------------------------------
BiThrTreepre;//全局变量,刚刚访问过的结点
boolInOrderThreading(BiThrTree&Thrt,BiThrTreeT){//中序线索二叉树
voidInThreading(BiThrTreep);
Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
Thrt->LTag=0;
Thrt->RTag=1;//创建头结点
Thrt->rchild=Thrt;//头节点右指针回指
if(!
T)
Thrt->lchild=Thrt;//空二叉树,头节点左指针回指
else{
Thrt->lchild=T;
pre=Thrt;//pre:
刚刚访问过的结点;
InThreading(T);//中序遍历二叉树T进行中序线索化操作
pre->rchild=Thrt;
pre->RTag=1;//pre指向最后一个节点,将其线索化
Thrt->rchild=pre;
}
return1;
}
voidInThreading(BiThrTreep){//中序遍历过程中进行中序线索化
if(p){
InThreading(p->lchild);//左子树线索化
if(!
p->lchild){//建立p的直接前驱线索
p->lchild=pre;
p->LTag=1;
}
if(!
pre->rchild){//建立pre的直接后继线索
pre->rchild=p;
pre->RTag=1;
}
pre=p;//确保pre恒指向直接前驱
InThreading(p->rchild);//右子树线索化
}
}
//---------------------------遍历中序线索化二叉树-------------------------------
voidInOrderTraverse_Thr(BiThrTreeThrt)//Thrt:
头结点
{//遍历中序线索化二叉树
BiThrTreep;
p=Thrt->lchild;
while(p!
=Thrt){
while(p->LTag==0)
p=p->lchild;
printf("%c→",p->data);
while((p->RTag==1)&&(p->rchild!
=Thrt)){
p=p->rchild;
printf("%c\n%c→",p->data,p->data);
}
p=p->rchild;
}
}
//-----------------查找某节点的前驱节点和后继节点-----------------------------
//查找节点P的前驱节点
BiThrTreeInpre(BiThrTreep){/*在中序线索二叉树上寻找节点p的中序直接前驱*/
BiThrTreepre;
pre=p->lchild;
if(p->LTag!
=1)//左子树存在
while(pre->RTag==0)
pre=pre->rchild;//寻找最右节点
returnpre;
}
//查找后继节点
BiThrTreeInsub(BiThrTreep){/*在中序线索二叉树上寻找节点p的中序直接后继*/
BiThrTreepost;
post=p->rchild;
if(p->RTag!
=1){//右子树存在
while(post->RTag==0)
post=post->lchild;////寻找最左节点
}
returnpost;
}
//按值查找节点
BiT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计