利用二叉排序树对顺序表进行排序.docx
- 文档编号:24540066
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:33
- 大小:245.85KB
利用二叉排序树对顺序表进行排序.docx
《利用二叉排序树对顺序表进行排序.docx》由会员分享,可在线阅读,更多相关《利用二叉排序树对顺序表进行排序.docx(33页珍藏版)》请在冰豆网上搜索。
利用二叉排序树对顺序表进行排序
长沙学院
课程设计说明书
题目
利用二叉排序树对顺序表进行排序
系(部)
专业(班级)
姓名
学号
指导教师
起止日期
2015.12.8—2015.12.15
课程设计任务书
课程名称:
数据结构与算法课程设计
设计题目:
为了充分调动学生的学习积极性与主动性,适应不同兴趣、不同程度的学生对课程设计的要求,本课程设计提供四个任选题。
每个学生可以根据本人的兴趣及能力选择教师指定的选题,也可以自定其他的选题。
1、一元多项式计算问题
2、迷宫问题
3、利用二叉排序树对顺序表进行排序
4、交通咨询系统
5、内部排序算法的比较
已知技术参数和设计要求:
需求说明及要求
题目三:
利用二叉排序树对顺序表进行排序
问题描述:
利用二叉排序树对顺序表进行排序。
基本要求:
(1)生成一个顺序表L;
(2)对所生成的顺序表L构造二叉排序树;
(3)利用栈结构实现中序遍历二叉排序树;
(4)中序遍历所构造的二叉排序树将记录由小到大输出。
测试数据:
用伪随机数产生程序产生,表长不小于20。
选作内容:
用实现二叉排序树的插入和删除操作。
各阶段具体要求:
1、需求分析阶段
熟悉系统业务,从业务中抽取出系统的需求,形成完善的需求说明书。
2、系统设计阶段
根据需求,进行程序设计,包括定义系统的界面、定义系统数据的存储方式等,形成完善的设计说明书。
3、编码实现阶段
(1)完成代码编写
(2)要求代码编写规范
4、系统测试阶段
(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)对所生成的顺序表L构造二叉排序树;
(3)利用栈结构实现中序遍历二叉排序树;
(4)中序遍历所构造的二叉排序树将记录由小到大输出。
测试数据:
用伪随机数产生程序产生,表长不小于20。
选作内容:
用实现二叉排序树的插入和删除操作。
第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
parents=child;//parents纪录child结点的上一个结点,相当于记录父节点
child=child->lchild;
}
else{
parents=child;
child=child->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;//赋值
S->lchild=NULL;
S->rchild=NULL;
if(!
tree)tree=S;//如果tree为空,则tree为s,设置根结点
elseif(value
parents->lchild=S;
}
else{
parents->rchild=S;//反之,插入到右子树
}
}
return1;
//returntree;
}
4.2删除模块的设计
boolDelete_BSTree(Btree&tree,keytypevalue){//删除函数
if(!
tree)return0;//tree为空,则表示删除功能不能执行
else{
if(value==tree->data){//如果找到与value值相同的指针,调用delete_value函数进行删除
delete_value(tree);
return1;
}
elseif(value
returnDelete_BSTree(tree->lchild,value);
}
else{
returnDelete_BSTree(tree->rchild,value);
}
}
//printf("%d\n",tree->data);
}
voiddelete_value(Btree&p){
Btreeq=NULL,s=NULL;
if(p->lchild&&p->rchild){//删除的结点,左右子树都不为空的情况
q=p;s=p->lchild;//q记录,s设为删除结点的左结点
while(s->rchild){
q=s;s=s->rchild;
}//进行循环,找到最右边的那个结点
p->data=s->data;//把找到的最右边结点的关键字赋值给p的关键字
if(q!
=p)q->rchild=s->lchild;//挂接左右子树
elseq->lchild=s->lchild;
//printf("%d\t%d\t%d\t%d\n",q->data,q->data,s->data,tree->data);
free(s);//删除s这个结点
}
else{
if(!
p->rchild){//右子树为空,所以挂接到左子树上
q=p;p=p->lchild;free(q);
}
else{
q=p;p=p->rchild;free(q);//左子树为空,所以挂接到右子树上
}
//printf("%d\t%d\t%d\n",q->data,q->data,tree->data);
}
}
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->lchild;//对左子树进行遍历
}
if(!
empty_stack(&S)){
e=Get_top(S,e);//当栈不为空时,取栈顶,输出栈顶指针所指向的data值
printf("%d\n",e->data);
pop_stacks(&S,p);//出栈,对右子树进行遍历
p=p->rchild;
}
}
/*if(T){
inoder_rec(T->lchild);
printf("%d\n",T->data);
inoder_rec(T->rchild);
}*/
//menu(tree);
}
4.4树型打印模块的设计
voidPrintTree(Btreebt,intnlayer)//
{//采用先序遍历的方法,进行树型打印
if(bt){
PrintTree(bt->rchild,nlayer+10);
for(inti=0;i { printf(""); } printf("%d\n",bt->data); PrintTree(bt->lchild,nlayer+10); } } 4.5重建二叉树模块的设计 BtreeBSTree_fund(){ structint_linklist*lists=NULL; Btreetree=NULL; intn; lists=init();//初始化顺序表 srand((unsigned)time(NULL));//伪随机函数的初始化 printf("pleaseinputhowmanynumbers: \n"); scanf_s("%d",&n);//输入要插入多少的数 for(inti=0;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->next; }//调用insert_BSTree函数构造二叉树 returntree; } 第五章模块测试 5.1插入模块测试 5.2删除插入模块测试 5.3遍历模块测试 5.4树型打印模块测试 5.5二叉排序树重建模块测试 第六章总结 通过这次课程设计,我对二叉排序树的整个构造流程更加了解了,同时也对顺序表和栈这两种数据结构做了一次复习,但同时也存在了很多问题。 我在删除函数中因为有些指针没有用好,所以最开始只是跟我报错说是read()出错,我反复的检查许久一直找不到出错的地方在哪,不得已,只能重新写了一遍删除函数,发现我分成两个删除函数去执行(一个函数去找那个需要删除的结点,另一个函数则是对这已经找到的结点进行删除),没有问题。 而对于中序遍历函数,我先用递归做测试,先把其他功能做完善以后,再用栈来实现中序非递归遍历。 第七章附录源代码 #include #include #include #include #include //#include //usingnamespacestd; //////////// unsignedintn=30; ////////// typedefintkeytype; typedefintvaluetype; typedefintlisttype; ///////////////////////////// structlinklist{ structlinklist*next; intelement; }; structint_linklist{ structlinklist*head; intcounts; }; //////////////////////// typedefstructBSTNode{ keytypedata; structBSTNode*lchild,*rchild; }BTNode,*Btree; ///////////////////// typedefBtreeSelem; typedefstructsnode{ Selemdata; structsnode*next; }snode,*linkst; typedefstructlinkstack{ linksttop; intcount; }linkstack; ///////////////////// 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); boolDelete_BSTree(Btree&,keytype); voiddelete_value(Btree&tree); voidinoder_rec(Btree); voidPrintTree(Btree,int); ////////////////////////////////////// voidmenu(Btree); //////////////////、 intmain(){ Btreetree=NULL; //printf_list(lists); tree=BSTree_fund(); //printf("\n"); //printf("%d\n",tree->data); //printf("\n"); //inoder_rec(tree); menu(tree); return0; } ////////////////////// structint_linklist*init(){ structint_linklist*lists; lists=(structint_linklist*)malloc(sizeof(structint_linklist*)); lists->head=(structlinklist*)malloc(sizeof(structlinklist)); lists->head->element=-1; lists->counts=0; lists->head->next=NULL; returnlists; } voidadd(structint_linklist*lists,intvalue){ structlinklist*p; p=(structlinklist*)malloc(sizeof(structlinklist)); p->next=NULL; p->element=value; p->next=lists->head->next; lists->head->next=p; lists->counts++;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 二叉排序树 顺序 进行 排序