数据结构课程设计二叉连链表.docx
《数据结构课程设计二叉连链表.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计二叉连链表.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构课程设计二叉连链表
课程设计指导书
姓名
学号
班级
课程名称
数据结构
课程性质
专业必修课
设计时间
2010年12月1日——2010年12月20日
设计名称
设计二叉链表结构的相关函数库
设计目的
使用MicrosoftVisualC++设计二叉链表结构的相关函数库,并能够在程序设计中调用
设计要求
设计二叉链表结构的相关函数库,以便在程序设计中调用,实现二叉树的各种基本函数以及常用函数;并给出1-2个例子,通过调用自己的库函数来实现问题的求解。
设计思路
与
设计过程
1.程序需求分析
完成:
根据需求分析,确定各个程序功能的需求;
2.程序总统设计
完成:
根据程序需求,进行程序大概框架的设计;
3.主函数设计
完成:
主函数程序中设计一个菜单,并调试所用算法;
4.其他函数设计
完成:
建立二叉链表以及递归序列遍历算法
5.系统程序完善
完成:
完善整个程序细节代码的要求,进行调试。
计划与进度
12.1-12.2复习对vc++6.0使用,了解关于二叉链表的相关特征等。
12.3-12.4查找有关二叉链表基本操作的算法等。
12.5-12.7根据需求分析,确立各个函数程序功能。
12.8-12.10根据程序需求,进行相关子函数程序的编写。
12.11-12.13进行主函数程序功能的设计编写。
12.14-12.16进行对整个程序的完善。
12.17-12.18进行程序的调试运行。
12.19-12.20资料归档,填写相关文档。
任课教师
意见
备注
课程设计报告
课程:
学号:
姓名:
班级:
教师
时间:
计算机科学与技术系
设计名称:
设计二叉链表的相关函数库
日期:
2010年12月20日
设计内容:
使用MicrosoftVisualC++设计二叉链表结构的相关函数库,以便在程序设计中调用
设计目的与要求:
设计二叉链表结构的相关函数库,在程序设计中调用,并实现二叉树的各种基本函数以及常用函数。
设计环境或器材、原理与说明:
器材:
计算机一台
硬件环境:
处理器:
Intelcorei3
内存:
1GB
硬盘空间:
320GB
显卡:
ATIMobilityRadeon
软件环境:
WindowsXP,MicrosoftVisualC++6.0
使用数据结构设计的一般方法步骤进行设计。
设计过程(步骤)和部分程序代码(可以加页):
一.题目要求
设计二叉链表结构的相关函数库,在程序设计中调用,并实现二叉树的各种基本函数以及常用函数。
二.需求分析
建立一棵二叉树:
(1)二叉树的链表结构;
(2)进行先序遍历,输出结果;
(3)进行中序遍历,输出结果;
(4)进行后序遍历,输出结果;
(5)进行层次遍历,输出结果。
三.运行环境
WindowsXP
四.开发工具和编程语言
1.开发工具:
MicrosoftVisualC++6.0
2.编程语言:
C语言
五.概要设计
1.数据结构
typedefchardatatype;
typedefstructnode//定义二叉树结点类型
{
datatypedata;
structnode*lchild;
structnode*rchild;
}Btnode,*Btree;
2.模块划分
1.根据先序递归建立二叉树
Btreepre_creat()
2.递归遍历输出函数
voidpreorder_btree(Btreeroot)//由先根序列遍历输出二叉树
voidinorder_btree(Btreeroot)//由中根序列遍历输出二叉树
voidpostorder_btree(Btreeroot)//由后根序列遍历输出二叉树
3.层次遍历输出算法
voidlevel_btree(Btreeroot)//层次遍历输出二叉树
六.详细设计
1.创建二叉树的实现
Btreepre_creat()//使用先根序列建立二叉树,返回指针
{
Btreet;
charch;
fflush(stdin);
scanf("%c",&ch);//输入一个结点数据
if(ch=='@')
returnNULL;//空结点
else
{
t=(Btnode*)malloc(sizeof(Btnode));//申请结点空间,根节点
t->data=ch;
t->lchild=pre_creat();//生成左子树
t->rchild=pre_creat();//生成右子树
}
returnt;
}
2.先序、中序、后序递归遍历输出算法
voidpreorder_btree(Btreeroot)//由先根序列输出二叉树
{
Btreep=root;
if(p!
=NULL)
{
printf("%3c",p->data);//输出结点值
preorder_btree(p->lchild);//输出左子树
preorder_btree(p->rchild);//输出右子树
}
}
voidinorder_btree(Btreeroot)//由中根序列输出二叉树
{
Btreep=root;
if(p!
=NULL)
{
inorder_btree(p->lchild);//输出左子树
printf("%3c",p->data);//输出结点值
inorder_btree(p->rchild);//输出右子树
}
}
voidpostorder_btree(Btreeroot)//由后根序序列输出二叉树
{
Btreep=root;
if(p!
=NULL)
{
postorder_btree(p->lchild);//输出左子树
postorder_btree(p->rchild);//输出右子树
printf("%3c",p->data);//输出结点值
}
}
3.层次遍历输出算法
voidlevel_btree(Btreeroot)//层次遍历输出二叉树
{
Btreep;
p=(Btnode*)malloc(sizeof(Btnode));//申请一个新结点
p->data='@';
p->lchild=p->rchild=NULL;//为新结点赋初值
intfront,rear;
front=rear=0;//置空队列
p=root;//工作结点指向根节点
if(p!
=NULL)
{
rear++;
Q[rear]=p;//结点不为空就入队
if(rear==1)
{
front=1;
Q[front]=p;//根节点入队作为队列头结点
rear++;
}
while(front!
=rear)
{
p=Q[front];//队头结点出队
front++;
printf("%3c",p->data);
if(p->lchild!
=NULL)
{
Q[rear]=p->lchild;
rear++;
}
if(p->rchild!
=NULL)
{
Q[rear]=p->rchild;
rear++;
}
}
}
}
这三个函数实现了二叉树的递归遍历方法。
先序思想是先根、后左孩子、再右孩子,中序遍历思想是先左孩子、后根、再右孩子,后序是先左孩子、后右孩子、再根。
4.主函数
intmain()
{
Btreeboot;
boot=(Btnode*)malloc(sizeof(Btnode));
boot=NULL;
intx;
do
{
printf("_____________________________________\n");
printf("--------------欢迎使用!
-------------\n");
printf("_____________________________________\n");
printf("\n***************主菜单****************\n");
printf("x=1...先序遍历建立二叉树!
\n");
printf("x=2...先序遍历输出二叉树!
\n");
printf("x=3...中序遍历输出二叉树!
\n");
printf("x=4...后序遍历输出二叉树!
\n");
printf("x=5...层次遍历输出二叉树!
\n");
printf("x=0...退出\n");
printf("****************************************\n");
do
{
fflush(stdin);
printf("请输入x的值:
");
scanf("%d",&x);
if((x!
=1)&&(x!
=2)&&(x!
=3)&&(x!
=4)&&(x!
=0)&&(x!
=5))
{
printf("请输入正确的x的值\n");
}
}while((x!
=1)&&(x!
=2)&&(x!
=3)&&(x!
=4)&&(x!
=0)&&(x!
=5));
switch(x)
{
case1:
printf("\t先序遍历建立二叉树:
\n");
printf("\t请输入二叉树结点的值!
:
\n");
printf("(可以输n个值均为字母或'@'(n<100)字符间以回车符换行,想结束时输多个'@'):
\n");
boot=pre_creat();//顺序表的逆置
printf("\n\n");
break;
case2:
printf("\t先序遍历输出二叉树!
:
\n");
printf("建立的二叉树是:
");
preorder_btree(boot);
printf("\n\n");
break;
case3:
printf("\t中序遍历输出二叉树!
:
\n");
printf("建立的二叉树是:
");
inorder_btree(boot);
printf("\n\n");
break;
case4:
printf("\t后序遍历输出二叉树!
:
\n");
printf("建立的二叉树是:
");
postorder_btree(boot);
printf("\n\n");
break;
case5:
printf("\t层次遍历输出二叉树!
:
\n");
printf("建立的二叉树是:
");
level_btree(boot);
printf("\n\n");
break;
}
}while(x!
=0);
printf("ByeBye!
");
returnx;
}
7.运行结果:
图一
图二
图三
图四
图五
图六
图七
设计结果与分析(可以加页):
本次课程设计实现了二叉链表的相关函数库的调用。
为了实现以链表为存储结构的二叉树的有关操作,要熟练掌握二叉链表的特性,但对于一些算法较为复杂,代码量多些,容易出现一些变量的定义、函数声明、函数调用等细节上的问题出错。
在本程序的设计过程中,为了克服以上困难,采取了一些措施:
建立清晰的程序设计的步骤方法,分步各个模块程序设计,进行仔细的总体结构设计,反复调试、细心观察达到完善整个系统等。
设计体会与建议:
数据结构是计算机程序设计的重要理论技术基础,在理论学习和基础实验的基础上,通过实践设计一定量的程序,掌握应用计算机解决实际问题的基本方法,是理解和运用数据结构及算法,提高编程能力的有效途径,并为学习软件专业课程积累理论基础和实践基础。
程序的设计和开发过程,不仅要求我们牢固地掌握各种基础知识,更考查了对基础知识的综合运用能力。
这次我的实验课题是二叉树的基本算法综合分析。
算法是数据结构的核心,是我们学习软件开发必须掌握的基本知识。
简单课程设计最重要的是基础知识的运用,以及综合分析问题的能力。
二叉树的递归算法主要是将二叉树存储到链表结构中。
遍历是二叉树各种操作的基础,先序、中序、后序是二叉树遍历的三种基本遍历方法。
而这些都是数据结构的基础内容,是我们必须理解和牢记的基础知识。
将这些基础算法综合起来,更能清晰地认识和理解各种算法的作用。
当然,要学会编程不会仅局限于课本知识,而是根据课本知识进行有效的拓展,并且不得不学会在众多的参考资料中搜索有用的自己所需的知识,并迫使自己去学习掌握它们,从中不断提高自己。
例如,课本上只给出了二叉树的递归中序遍历方法,由此可容易推出递归的前序和中序遍历方法。
二叉树的基本操作是多种多样的,由于时间的短促和作者水平有限,因不能做太大规模的设计。
虽然程序规模不大,我依然为此付出了努力,仍免不了各种错误的出现。
编程过程需要很大的毅力和耐心,而且要有良好的思维和扎实的专业基础知识,所以我需要不断的学习,发现自身不足之处并改正它,逐步提高自身能力,不断取得进步。
对于数据结构的学习,我一直感到很吃力,但想过放弃。
通过实践,让我们认识到知识的运用性,并加深对基础知识的理解,从中了解自己需要学习的东西并学会自学。
在此我要感谢我的老师对我们专心致志的辅导,让我学会了许多分析和解决问题的方法,让我受益匪浅。
作为一名计算机专业的学生,今后我将加倍努力学习专业知识,为自己从事的职业打下坚实基础。
设计成绩:
教师签名:
年月日