设计出树结构的相关函数库以便在程序设计中调用可编辑doc文档格式.docx
《设计出树结构的相关函数库以便在程序设计中调用可编辑doc文档格式.docx》由会员分享,可在线阅读,更多相关《设计出树结构的相关函数库以便在程序设计中调用可编辑doc文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
应当提交的文件:
(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!
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;
return;
pQ-front-next;
Q-front-nextp-next;
ifQ-rearp
*xp-data;
freep;
4.5递归遍历输出函数
voidCreateBiTreeBiTree*bl
charch;
chgetchar;
ifch'
.'
*btNULL;
else
*btBiTreemallocsizeofBiTNode;
*bt-datach;
CreateBiTree&
*bt-Lchild;
*bt-RchiId;
/*先序递归遍历二叉树*/
voidPreOrderBiTreeroot
ifroot!
printf〃%c,z,root-data;
PreOrderroot-LchiId;
PreOrderroot-RchiId;
/*后序递归遍历二叉树*/
4.6层次遍历输出算法
voidPostOrderBiTreeroot
PostOrderroot-Lchild;
PostOrderroot-Rchild;
printf/z%c,z,root-data;
voidTnOrderBiTreeroot
InOrderroot-LchiId;
printf"
%c,z,root-data;
InOrderroot-RchiId;
4.7求二叉树深度得算法
voiddepthBiTreeroot,int&
dep
intdepl,dep2;
if!
rootdepO;
dcpthroot-LchiId,dcpl;
dcpthroot-RchiId,dcp2;
dcpdcpldcp2?
dcpl+l:
dep2+l;
4.8求二叉树叶子结点数的算法
voidcountleafBiTreeroot,int&
n
ifroot
countleafroot-LchiId,n;
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
typcdcfstructNode
BiTNode,^BiTree;
typedefstructQucueNode
LinkQueueNode;
typedefstruct
LinkQueueNode*fTont;
//队列
Q-front-next
NULL;
elseprintfz,分配空间失败!
\n〃;
/*入队*/
voidEnterQueueLinkQueue*Q,BiTreex
NewNodeLinkQueueNode*mallocsizeofLinkQueueNode;
ifNewNode!
MULL
NewNode-data
x;
NewNode-next
Q-rcar-ncxt
NewNode;
/*队列判空*/
intQueueIsEmpt^^LinkQueue*Q
/*出队*/
voidDeleteQueueLinkQueueBiTree*x
/*利用扩展先序遍历序列
创建二叉链表*/
voidCreateB订reeB订ree*bt
ifch*btNULL;
*bt~datach;
CrcatcBiTrcc&
^bt-Lch订d;
PreOrderroot-Lchild;
PreOrdcrroot-RchiId;
PostOrderroot-LehiId;
printf/z%cz/,root-data;
voidInOrderBiTreeroot
TnOrderroot-Lchild;
printfz,%croot-data;
/*层序遍历
对给定的二叉树进行层序遍历*/
voidLayerOrderBiTreeroot
BiTree*x;
//这里要记得申请空间xBiTrcc*mallocsizcofBiTrcc;
ifxNULLprintf,z内存分配失败!
LinkQueue*Q;
QLinkQueue*mcillocsizeofLinkQueue;
InitQueueQ;
"
、*x-data;
if*x-LchildEnterQueueQ,*x-Lchild;
if*x-RchildEnterQueueQ,*x-Rch订d;
rootdcpO;
depthroot-LchiId,depl;
depthroot-RchiId,dep2;
depdepldep2?
depl+l:
deP2+1;
intmainintargc、char**argv
intnO,dep;
BiTrccroot;
CrcatcBiTrcc&
root;
printf〃先序递归遍历:
PreOrderroot;
printf〃\n〃;
printf"
中序递归遍历:
InOrderroot;
printf,z\n"
;
后序递归遍历:
\n,z;
PostOrderroot;
printf〃\rT;
printf〃层序遍历:
LayerOrderroot;
printf〃\n〃;
depthroot,dep;
printf〃深度dep%d\n〃,dep;
countleafroot,n;
prin叶子结点数n%d\nz\n;
return0;