设计出树结构的相关函数库以便在程序设计中调用可编辑doc.docx
《设计出树结构的相关函数库以便在程序设计中调用可编辑doc.docx》由会员分享,可在线阅读,更多相关《设计出树结构的相关函数库以便在程序设计中调用可编辑doc.docx(10页珍藏版)》请在冰豆网上搜索。
设计出树结构的相关函数库以便在程序设计中调用可编辑doc
《数据结构》课程设计报告
学院专业
班级学号学生姓名***指导教师
课程成绩完成日期2013年7月12日课程设计成绩评定
学院城南学院专业计算机科学与技术
班级学号
学生姓名指导教师完成日期2013年7月12日指导教师对学生在
课程设计中的评价
评分项目优良中及格不及格
课程设计屮的创造性成果
学生掌握课程内容的程度
课程设计完成情况
课程设计动手能力
文字表达
学习态度
规范要求
课程设计论文的质量
指导教师对课程设计的评定意见
综合成绩指导教师签字2013年7月12日
课程设计任务书学院专业
课程名称数据结构课程设计时间2012^2013学年第二学期1旷20周
学生姓名指导老师
题目设计出树结构的相关函数库,以便在程序设计中调用
主要内容:
使用MicrosoftVisualC++6.0设计二叉链表结构的相关函数库,以便在程序设计中调用设计二叉链表结构的相关函数库,在程序设计中调用,并实现二叉树的各种基木函数以及常用函数。
要求:
(1)包括树结构的存储结构及各种基本函数以及常用函数(自己确定函数、函数形式及理由)。
(2)最好能借助语言环境实现图形显示功能,以便能将抽彖的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来。
(3)给出若干例程,演示通过调用自己的库函数来实现相关问题的求解。
应当提交的文件:
(1)课程设计学年论文。
(2)课程设计附件(主要是源程序)。
设计出树结构的相关函数库,以便在程序设计中调用
学生姓名:
指导老师:
摘要作为用户我们极少接触系统调用,但是我们熟悉C语言,对库函数的调用并不陌生。
C语言支持一系列库函数的调用,而事实上,库函数的调用是C语言在较高层次上调用的一种方式,函数调用是操作系统内核提供给程序员的程序设计界而,它们是内核提供给用户调用的函数。
使用MicrosoftVisualC++6.0设计二叉链表结构的相关函数库,操作系统通过执行main函数开始运行一个C程序。
main函数可以调用C程序屮的其他函数來完成程序的任务,其他函数也可以互相调用,但其他函数(非main函数)不能调用main函数(main函数只能由操
作系统来调用)。
关键词设计函数库;C程序的执行;C程序的调用;C语言;VC++6・0目录
1引言1
1.1课程设计目的1
1.2课程设计要求1
2问题的描述2
2.1问题的模型化描述2
3数据结构3
3.1定义二叉树结点类型3
4模块划分3
4.1入队3
4.2队列判空3
4.3出队4
4.4根据先序递归建立二叉树4
4.5递归遍历输出函数4
4.6层次遍历输出算法5
4.7求二叉树深度得算法5
4.8求二叉树叶子结点数的算法5
5运行程序6
6结束语8
附录:
源程序代码9
1引言
VisualC++6.0由许多织件组成,包括编辑器、调试器以及程序向导AppWizardx类向导ClassWizard等开发工具。
编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。
编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:
词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。
主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。
将编译产生的・obj文件和系统库连接装配成一个可以执行的程序。
由于在实际操作中可以直接点击Bidld从源程序产生可执行程序,将源程序翻译成可执行文件的过程分为编译和链接两个独立的步骤,Z所以这样做,主要是因为:
在一个较大的复杂项目中,有很多人共同完成一个项目每个人可能承担其中一部分模块,其中有的模块可能是用汇编语言写的,有的模块可能是用VC写的,有的模块可能是用VB写的,有的模块可能是购买不是源程序模块而是目标代码或已有的标准库模块,因此,各类源程序都需要先各自编译成目标程序文件,再通过链接程序将这些目标程序文件连接装配成可执行文件,再调用函数或运行可执行程序文件。
1.1课程设计目的
(1)使用MicrosoftVisualC++6.0设计二叉链表结构的相关函数库
(2)在程序设计中调用设计二叉链表结构的相关函数库
(3)在程序设计屮调用并实现二叉树的各种基本函数以及常用函数。
(1)按要求编写课程设计报告书,能正确阐述设计结果。
(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。
(3)学会文献检索的基本方法和综合运用文献的能力。
(4)在老师的指导下,要求每个学牛独立完成课程设计的全部内容。
2.问题的描述
2.1问题的模型化描述
3数据结构
3.1定义二叉树结点类型
typedefchardatatype;
typedefstructNode
chardata;
structNode*Lchild;
structNode*Rchild;
BiTNode,^BiTrcc;//二叉树节点,二叉链表
typedefstructQueueNode
BiTreedata;
structQueueNode*next;
LinkQueueNode;//队列中的每个节点
typedefstruet
LinkQueueNode*front;
LinkQueueNode*rear;
LinkQueue;//队列
4.模块划分
4.1入队
voidInitQueueLinkQueue*Q
Q-frontLinkQueueNode*mallocsizeofLinkQueueNode;
ifQ-front!
NULL
Q-rearQ-front;
Q-front-nextNULL;
elseprintf,z分配空间失败!
\n〃;
voidEnterQueueLinkQueue^Q,BiTreex
LinkQueueNode*NewNode;
NewNodeLinkQueueNode^malIocsizeofLinkQueueNode;ifNewNode!
NULL
NcwNode-datax;
NewNode-nextNULL;
Q-rear-nextNewNode;
Q-rearNewNode;
4.3出队
intQucucIsEmptyLinkQucuc*Q
ifQ-frontQ-rear
return1;
elsereturn0;
4.4根据先序递归建立二叉树
voidDclctcQueueLinkQucue*Q,BiTrcc*x
LinkQueueNode*p;
ifQ-frontQ-rear
return;
pQ-front-next;
Q-front-nextp-next;
ifQ-rearp
Q-rearQ-front;
*xp-data;
freep;
4.5递归遍历输出函数
voidCreateBiTreeBiTree*bl
charch;
chgetchar;
ifch'.'*btNULL;
else
*btBiTreemallocsizeofBiTNode;
*bt-datach;
CreateBiTree&*bt-Lchild;
CreateBiTree&*bt-RchiId;
/*先序递归遍历二叉树*/
voidPreOrderBiTreeroot
ifroot!
NULL
printf〃%c,z,root-data;
PreOrderroot-LchiId;
PreOrderroot-RchiId;
/*后序递归遍历二叉树*/
4.6层次遍历输出算法
voidPostOrderBiTreeroot
ifroot!
NULL
PostOrderroot-Lchild;
PostOrderroot-Rchild;
printf/z%c,z,root-data;
voidTnOrderBiTreeroot
ifroot!
NULL
InOrderroot-LchiId;
printf"%c,z,root-data;
InOrderroot-RchiId;
4.7求二叉树深度得算法
voiddepthBiTreeroot,int&dep
intdepl,dep2;
if!
rootdepO;
else
dcpthroot-LchiId,dcpl;dcpthroot-RchiId,dcp2;dcpdcpldcp2?
dcpl+l:
dep2+l;
4.8求二叉树叶子结点数的算法
voidcountleafBiTreeroot,int&n
ifroot
countleafroot-LchiId,n;if!
root-Lchild&&!
root-Rchild
n++;coun11eafroot-Rchi1d,n;
5运行程序
5.1程序运行结果7结束语
本次课程设计为时二周,我选的课题是设计岀树结构的相关函数库,以便在程序设计中的调用。
其主要研究内容在于实现了二叉链表的相关函数库的调用。
为了实现以链表为存储结构的二叉树的有关操作,要熟练掌握二叉链表的特性,但对于一些算法较为复杂,代码量多些,容易出现一些变量的定义、函数声明、函数调用等细节上的问题出错。
在本程序的设计过程屮,为了克服以上困难,采取了一些措施:
建立清晰的程序设计的步骤方法,分步各个模块程序设计,进行仔细的总体结构设计,反复调试、细心观察达到完善整个系统等。
二叉树的递归算法主要是将二叉树存储到链表结构中。
遍历是二叉树各种操作的基础,先序、中序、后序是二叉树遍历的三种基木遍历方法。
而这些都是数据结构的基础内容,是我们必须理解和牢记的基础知识。
将这些基础算法综合起来,更能清晰地认识和理解各种算法的作用。
当然,要学会编程不会仅局限于课本知识,而是根据课本知识进行有效的拓展,并且不得不学会在众多的参考资料中搜索有用的自己所需的知识,并迫使自己去学习掌握它们,从中不断提高自己。
虽然程序规模不大,我们依然为此付出了努力,仍免不了各种错误的出现。
编程过程需要很大的毅力和耐心,而且要有良好的思维和扎实的专业基础知识,所以我们需要不断的学习,发现自身不足之处并改止它,逐步提高自身能力,不断取得进步。
对于数据结构的学习,一直感到很吃力,也想过放弃。
通过实践,我们接触到了很多关于的MicrosoftVisualC++6.0编程让我们认识到知识的运用性,并加深对基础知识的理解,从中了解自己需要学习的东西并学会自学。
在此我们要感谢我的老师对我们专心致志的辅导,让我们学会了许多分析和解决问题的方法,让我们受益匪浅。
通过几个星期的努力,虽然从中也发现了&己很多不足,可能其中还有不少问题,但我觉得
最重要的是自己也从屮得到很多;不敢说百分百的完成也应该基本上完成了课题任务,成功地实现课题目标。
参考文献
[1]严蔚敏.数据结构(C语言版)[M]・北京:
清华大学出版社,1997.
[2]谭浩强.C程序设计(第三版)[M].北京:
清华大学出版社,2005.1附录:
源程序代码
ttinclude
ttinclude
typcdcfstructNode
chardata;
structNode*Lchild;
structNode*Rchild;
BiTNode,^BiTree;//二叉树节点,二叉链表
typedefstructQucueNode
BiTreedata;
structQueueNode*next;
LinkQueueNode;//队列中的每个节点
typedefstruct
LinkQueueNode*fTont;
LinkQueueNode*rear;
LinkQueue;//队列
voidInitQueueLinkQueue*Q
Q-frontLinkQueueNode*mallocsizeofLinkQueueNode;
ifQ-front!
NULL
Q-rearQ-front;
Q-front-next
NULL;
elseprintfz,分配空间失败!
\n〃;
/*入队*/
voidEnterQueueLinkQueue*Q,BiTreex
LinkQueueNode*NewNode;
NewNodeLinkQueueNode*mallocsizeofLinkQueueNode;
ifNewNode!
MULL
NewNode-data
x;
NewNode-next
NULL;
Q-rcar-ncxt
NewNode;
Q-rearNewNode;
/*队列判空*/
intQueueIsEmpt^^LinkQueue*Q
ifQ-frontQ-rear
return1;
elsereturn0;
/*出队*/
voidDeleteQueueLinkQueueBiTree*x
LinkQueueNode*p;
ifQ-frontQ-rear
return;
pQ-front-next;
Q-front-nextp-next;
ifQ-rearp
Q-rearQ-front;
*xp-data;
freep;
/*利用扩展先序遍历序列
创建二叉链表*/
voidCreateB订reeB订ree*bt
charch;
chgetchar;
ifch*btNULL;
else
*btBiTreemallocsizeofBiTNode;
*bt~datach;
CrcatcBiTrcc&^bt-Lch订d;
CreateBiTree&*bt-RchiId;
/*先序递归遍历二叉树*/
voidPreOrderBiTreeroot
ifroot!
NULL
printf/z%c,z,root-data;
PreOrderroot-Lchild;
PreOrdcrroot-RchiId;
/*后序递归遍历二叉树*/
voidPostOrderBiTreeroot
ifroot!
NULL
PostOrderroot-LehiId;
PostOrderroot-Rchild;
printf/z%cz/,root-data;
voidInOrderBiTreeroot
ifroot!
NULL
TnOrderroot-Lchild;
printfz,%croot-data;
InOrderroot-RchiId;
/*层序遍历
对给定的二叉树进行层序遍历*/
voidLayerOrderBiTreeroot
BiTree*x;//这里要记得申请空间xBiTrcc*mallocsizcofBiTrcc;
ifxNULLprintf,z内存分配失败!
\n〃;
LinkQueue*Q;QLinkQueue*mcillocsizeofLinkQueue;InitQueueQ;
"、*x-data;
if*x-LchildEnterQueueQ,*x-Lchild;
if*x-RchildEnterQueueQ,*x-Rch订d;
voidcountleafBiTreeroot,int&n
ifroot
countleafroot-LchiId,n;if!
root-Lchild&&!
root-Rchild
n++;coun11eafroot-Rchi1d,n;
voiddepthBiTreeroot,int&dep
intdepl,dep2;
if!
rootdcpO;
else
depthroot-LchiId,depl;depthroot-RchiId,dep2;depdepldep2?
depl+l:
deP2+1;
intmainintargc、char**argv
intnO,dep;BiTrccroot;CrcatcBiTrcc&root;printf〃先序递归遍历:
\n〃;PreOrderroot;printf〃\n〃;printf"中序递归遍历:
\n〃;InOrderroot;printf,z\n";printf"后序递归遍历:
\n,z;PostOrderroot;printf〃\rT;printf〃层序遍历:
\n〃;LayerOrderroot;printf〃\n〃;depthroot,dep;printf〃深度dep%d\n〃,dep;countleafroot,n;prin叶子结点数n%d\nz\n;printf〃\n〃;return0;