利用二叉排序树对顺序表进行排序Word下载.docx

上传人:b****3 文档编号:18518575 上传时间:2022-12-18 格式:DOCX 页数:30 大小:246.31KB
下载 相关 举报
利用二叉排序树对顺序表进行排序Word下载.docx_第1页
第1页 / 共30页
利用二叉排序树对顺序表进行排序Word下载.docx_第2页
第2页 / 共30页
利用二叉排序树对顺序表进行排序Word下载.docx_第3页
第3页 / 共30页
利用二叉排序树对顺序表进行排序Word下载.docx_第4页
第4页 / 共30页
利用二叉排序树对顺序表进行排序Word下载.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

利用二叉排序树对顺序表进行排序Word下载.docx

《利用二叉排序树对顺序表进行排序Word下载.docx》由会员分享,可在线阅读,更多相关《利用二叉排序树对顺序表进行排序Word下载.docx(30页珍藏版)》请在冰豆网上搜索。

利用二叉排序树对顺序表进行排序Word下载.docx

(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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1