利用二叉排序树对顺序表进行排序Word下载.docx
《利用二叉排序树对顺序表进行排序Word下载.docx》由会员分享,可在线阅读,更多相关《利用二叉排序树对顺序表进行排序Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
(1)完成功能调试
(2)要求完成必要的测试工作
5、交付实施阶段
(1)提交可正常执行的系统
(2)提交系统需求说明书、设计说明书、程序代码
(3)撰写课程设计报告书
(4)要求规范地书写文档
设计工作量:
(1)软件设计:
完成问题陈述中所提到的所有需求功能。
(2)论文:
要求撰写不少于3000字的文档,详细说明各阶段具体要求。
工作计划:
数据结构课程设计总学时数为2周,其进度及时间大致分配如下:
序号设计内容天数
1分析问题,给出数学模型,选择数据结构1
2设计算法,给出算法描述2
3给出源程序清单1
4编辑、编译、调试源程序5
5编写课程设计报告1
总计10
注意事项
⏹提交文档
Ø
长沙学院课程设计任务书(每学生1份)
长沙学院课程设计鉴定表(每学生1份)
长沙学院课程设计说明书(每学生1份)
指导教师签名:
日期:
教研室主任签名:
日期:
系主任签名:
日期:
长沙学院课程设计鉴定表
专业
班级
设计题目
指导教师意见:
评定等级:
教师签名:
日期:
答辩小组意见:
答辩小组长签名:
日期:
教研室意见:
系(部)意见:
日期:
说明
课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;
摘要
数据结构是研究与数据之间的关系,我们称这一关系为数据的逻辑结构,简称数据结构。
当数据的逻辑结构确定以后,数据在物理空间中的存储方式,称为数据的存储结构。
相同的逻辑结构可以具有不同的存储结构,因而有不同的算法。
本次课程设计,是基于链式顺序表建立二叉排序树。
主要功能有建立、重建、插入、删除以及遍历。
关键词:
二叉排序树、中序遍历、插入结点、删除结点
第1章设计内容与要求
1.1课程名称:
设计题目:
利用二叉排序树对顺序表进行排序
问题描述:
1.2设计要求:
(1)生成一个顺序表L;
第2章需求分析
2.1设计目的
本次构造的是一个二叉排序树,主要的功能有二叉排序树的建立、节点的插入与删除,二叉树的中序遍历、树型打印、以及重建一个新的二叉排序树。
图2.1系统功能模块图
2.2设计环境
Windows10系统、visualstudio2015下编译运行
第三章概要设计
3.1功能结构
本程序主要实现的有七个功能,首先创建二叉排序树,完成后出现菜单界面,菜单界面的功能有:
二叉排序树的插入、删除、中序遍历、树形输出、二叉排序树的重建、退出。
创建二叉树
Switch
(1)
插入结点
删除结点
重建二叉树
树型打印
Exit(0)退出
中序遍历
Switch
(2)
Switch(3)
Switch(4)
Switch(5)
Switch(6)
图3.1主要功能结构流程图
3.2函数的结构体
typedefintkeytype;
typedefintvaluetype;
typedefintlisttype;
/////////////////////////////
structlinklist{
structlinklist*next;
intelement;
//参数的数值
};
//顺序表结点的结构体
structint_linklist{
structlinklist*head;
//顺序表的头结点的定义
intcounts;
//对顺序表的元素的多少进行统计
////////////////////////
typedefstructBSTNode{
keytypedata;
//存放关键字的data
structBSTNode*lchild,*rchild;
//定义二叉排序树的指针
}BTNode,*Btree;
/////////////////////
typedefBtreeSelem;
typedefstructsnode{
Selemdata;
//定义栈的存储的数据
structsnode*next;
//栈的指针
}snode,*linkst;
typedefstructlinkstack{
linksttop;
//定义栈的栈顶指针
intcount;
//统计栈里面的元素
}linkstack;
3.3系统主要的函数
structint_linklist*init();
//初始化链式顺序表
voidadd(structint_linklist*,int);
//链式顺序表增加结点
voidprintf_list(structint_linklist*);
//输出已经创建好的顺序表
voidemptyMessage(char*);
//输出错误的提示
voidinitstack(linkstack*);
//初始化链式栈
voidpush_stacks(linkstack*,Selem);
//进栈函数
voidpop_stacks(linkstack*,Selem&
);
//出栈函数
boolempty_stack(linkstack*);
//判断栈是否为空的函数
/////////////////////////
BTNode*init_BSTree(Btree);
//初始化二叉排序树
BtreeBSTree_fund();
//建立一个二叉排序树的函数
boolSearch_BSTree(Btree,keytype,BTNode&
BTNode&
//判断该值是否在二叉树存在
boolinsert_BSTree(Btree&
valuetype);
//插入一个数值,返回0或1,判断是否插入成功
boolDelete_BSTree(Btree&
keytype);
//删除函数,找到要删除的数值,调用delete_value(Btree&
tree),返回0或1判断删除是否成功
voiddelete_value(Btree&
tree);
//删除这个结点
voidinoder_rec(Btree);
//中序非递归遍历二叉排序树
voidPrintTree(Btree,int);
//按树状图就行输出
//////////////////////////////////////
voidmenu(Btree);
//函数的菜单界面
第四章详细设计
4.1插入模块的设计
boolSearch_BSTree(Btreetree,keytypevalue,Btree&
parents,Btree&
child){
//寻找函数,判断二叉排序树中是否有该值,有返回1,无返回0
child=tree;
//子节点等于根节点
while(child){//如果子节点child不为空,则执行下面代码
if(value==child->
data){//如果值等于child->
data,则表示找到,返回1
return1;
}
elseif(value<
child->
data){//如果该值小于child->
data,则向左子树进行查找
parents=child;
//parents纪录child结点的上一个结点,相当于记录父节点
child=child->
lchild;
else{
rchild;
}
return0;
//如果不执行上面一段代码,或者没有找到,返回0
//}
}
boolinsert_BSTree(Btree&
tree,keytypevalue){
Btreeparents,child;
//定义指针
if(!
Search_BSTree(tree,value,parents,child)){//如果二叉排序树找不到该值,则插入
BtreeS=(BTNode*)malloc(sizeof(BTNode));
//申请一个结构体空间
S->
data=value;
//赋值
lchild=NULL;
rchild=NULL;
if(!
tree)tree=S;
//如果tree为空,则tree为s,设置根结点
parents->
data){//如果value<
data,就插入到左子树
parents->
lchild=S;
rchild=S;
//反之,插入到右子树
return1;
//returntree;
4.2删除模块的设计
boolDelete_BSTree(Btree&
tree,keytypevalue){//删除函数
tree)return0;
//tree为空,则表示删除功能不能执行
else{
if(value==tree->
data){//如果找到与value值相同的指针,调用delete_value函数进行删除
delete_value(tree);
tree->
data){//value小于结点的值,往左子树进行寻找
returnDelete_BSTree(tree->
lchild,value);
rchild,value);
//printf("
%d\n"
tree->
data);
p){
Btreeq=NULL,s=NULL;
if(p->
lchild&
&
p->
rchild){//删除的结点,左右子树都不为空的情况
q=p;
s=p->
//q记录,s设为删除结点的左结点
while(s->
rchild){
q=s;
s=s->
}//进行循环,找到最右边的那个结点
p->
data=s->
data;
//把找到的最右边结点的关键字赋值给p的关键字
if(q!
=p)q->
rchild=s->
//挂接左右子树
elseq->
lchild=s->
//printf("
%d\t%d\t%d\t%d\n"
q->
data,q->
data,s->
data,tree->
free(s);
//删除s这个结点
p->
rchild){//右子树为空,所以挂接到左子树上
q=p;
p=p->
free(q);
//左子树为空,所以挂接到右子树上
%d\t%d\t%d\n"
q->
data,q->
data,tree->
4.3遍历模块设计
voidinoder_rec(BtreeT){
linkstackS;
initstack(&
S);
//初始化一个栈
Seleme;
Btreep=T;
while(p||!
(S.count==0)){//当栈不为空或者p不为空时执行
while(p){
push_stacks(&
S,p);
//p不为空,则进栈
p=p->
//对左子树进行遍历
if(!
empty_stack(&
S)){
e=Get_top(S,e);
//当栈不为空时,取栈顶,输出栈顶指针所指向的data值
printf("
e->
data);
pop_stacks(&
//出栈,对右子树进行遍历
/*if(T){
inoder_rec(T->
lchild);
printf("
T->
rchild);
}*/
//menu(tree);
4.4树型打印模块的设计
voidPrintTree(Btreebt,intnlayer)//
{//采用先序遍历的方法,进行树型打印
if(bt){
PrintTree(bt->
rchild,nlayer+10);
for(inti=0;
i<
nlayer;
i++)
{
"
printf("
%d\n"
bt->
lchild,nlayer+10);
4.5重建二叉树模块的设计
BtreeBSTree_fund(){
structint_linklist*lists=NULL;
Btreetree=NULL;
intn;
lists=init();
//初始化顺序表
srand((unsigned)time(NULL));
//伪随机函数的初始化
pleaseinputhowmanynumbers:
\n"
scanf_s("
%d"
&
n);
//输入要插入多少的数
i<
n;
i++){
add(lists,rand());
//构造顺序表
structlinklist*p;
//Btreetree=NULL;
tree=init_BSTree(tree);
//初始化二叉树
p=lists->
head->
next;
while(p!
=NULL){
insert_BSTree(tree,p->
element);
p=p->
}//调用insert_BSTree函数构造二叉树
returntree;
第五章模块测试
5.1插入模块测试
5.2删除插入模块测试
5.3遍历模块测试
5.4树型打印模块测试
5.5二叉排序树重建模块测试
第六章总结
通过这次课程设计,我对二叉排序树的整个构造流程更加了解了,同时也对顺序表和栈这两种数据结构做了一次复习,但同时也存在了很多问题。
我在删除函数中因为有些指针没有用好,所以最开始只是跟我报错说是read()出错,我反复的检查许久一直找不到出错的地方在哪,不得已,只能重新写了一遍删除函数,发现我分成两个删除函数去执行(一个函数去找那个需要删除的结点,另一个函数则是对这已经找到的结点进行删除),没有问题。
而对于中序遍历函数,我先用递归做测试,先把其他功能做完善以后,再用栈来实现中序非递归遍历。
第七章附录源代码
#include<
iostream>
malloc.h>
cstdio>
stdlib.h>
time.h>
//#include<
graphics.h>
//usingnamespacestd;
////////////
unsignedintn=30;
//////////
//////////////////、
intmain(){
//printf_list(lists);
tree=BSTree_fund();
//inoder_rec(tree);
menu(tree);
//////////////////////
structint_linklist*init(){
structint_linklist*lists;
lists=(structint_linklist*)malloc(sizeof(structint_linklist*));
lists->
head=(structlinklist*)malloc(sizeof(structlinklist));
element=-1;
counts=0;
next=NULL;
returnlists;
voidadd(structint_linklist*lists,intvalue){
p=(structlinklist*)malloc(sizeof(structlinklist));
element=value;
next=lists->
next=p;