数据结构课程设计动态查找表教材Word格式文档下载.docx
《数据结构课程设计动态查找表教材Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计动态查找表教材Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
本课程设计说明书系统地阐述了我使用C语言在Code:
:
Blocks软件编写的动态查找表程序的整个过程,编写的环境是win764位操作系统。
根据题目要求,编写动态查找表使用二叉排序树,即二叉链表作为存储结构。
该程序具有建立数据功能、具有数据查找功能、具有数据插入功能、具有数据删除功能等基本功能操作。
关键词:
动态查找表,Code:
Blocks软件,win764位操作系统,C#
dynamiclookuptable
Author:
yinjie
Tutor:
Wangxiaoying
Abstract
ThiscoursedesignspecificationsystemtoexplainthewholeprocessofusingClanguageinCode:
Blockssoftwarewritteninthedynamiclook-uptableprogram,thepreparationoftheenvironmentiswin764bitoperatingsystem.Accordingtothetopicrequest,thepreparationofthedynamiclook-uptableusingthetwoforksorttree,thatis,thetwobinarylistasthestoragestructure.Theprogramhasthefunctionofbuildingdata,datasearching,datainsertion,datadeletionandsoon.
Keywords:
dynamiclookuptable,Code:
Blockssoftware,win764bitoperatingsystem,C#
引言
查找的基本概念
查找又称为检索,就是从一个数据元素集合中找出某个特定的数据元素。
查找是数据处理中最为常用的一种操作,查找算法的优劣对整个软件系统的效率影响很大,尤其当所涉及的数据量较大时,更是如此。
在一个数据集合中进行查找操作可选用的方法与该数据元素集合的存储结构有很大关系。
查找是根据某个给定的值,在数据元素构成的集合中确定是否在这样一个数据元素,它的关键字等于给定值的关键字。
要进行查找,必须明确要查找对象的特征,也就是要查找元素的关键值。
如果在数据集合中能找到与给定值相等的关键字,则该关键字所属的数据元素就是所要查找的数据元素,此时称该查找成功;
如果查遍了整个数据元素集合也未能找到与给定值相等的关键字,则称该查找失败。
小结
当然对于这个说明书,我不可能做得至善至美,但是一些基本的格式内容还是符合要求的。
首先,我对查找表进行一个简要的概述。
然后,我就查找表进行了详细的分析,这是设计中很重要的一步。
接下来,我把查找表中所有的设计简明清晰地展现出来,并把我在设计中遇到的问题和分析解决问题的办法做了分析。
最后,在结论中,我对自己的课程设计做了总体的评价同时简述了我在这次课程设计中的收获和经验。
题目
选题十二:
【问题描述】
利用二叉排序树完成动态查找表的建立、指定关键字的查找、插入与删除指定关键字结点。
【任务要求】
算法输入:
指定一组数据。
算法输出:
显示二叉排序树的中序遍历结果、查找成功与否的信息、插入和删除后的中序遍历结果(排序结果)。
算法要点:
二叉排序树建立方法、动态查找方法,对树进行中序遍历。
【测试数据】
自行设定,注意边界等特殊情况。
第1章 程序的构图设计
1.1动态查询表:
依照输入的一组数据{56,80,65,20}所得的二叉排序树如下(a)所示:
当插入11的时候就如(b)所示。
(a)(b)
1.2程序功能流程图:
(1)、主函数模块
(2)、二叉排序树的生成
(3)、二叉排序树的查找模块
(4)、二叉排序树的插入模块
(5)、二叉排序树删除连接模块
(6)、二叉排序树的删除模块
(7)、二叉排序树的遍历模块
第2章 详细设计的程序
各函数模块
(1)主函数模块:
用主函数main()来实现。
主要是通过设计一个do()函数并让主函数调用它来显示主菜单,让用户选择操作。
在do()函数中,我应用了switch-case语句来进行选择,是个比较简单实现的模块。
最后若选择“5”退出循环。
否则继续循环。
主要代码如下:
intmain()
{
bitreeT=NULL,p;
ElemTypee;
intn;
inth;
charc;
do{
printf("
********************************************************\n"
);
**\n"
*动态查找表*\n"
*1.建立二叉排序树*\n"
*2.二叉排序树查找元素*\n"
*3.二叉排序树插入元素*\n"
*4.二叉排序树删除元素*\n"
*5.退出*\n"
请输入你的选择:
\n"
scanf("
%d"
&
h);
switch(h)
{
case1:
Init(T);
printf("
中序遍历二叉排序树:
"
Zhongxu(T);
\n"
break;
case2:
请输入要查找的数据:
scanf("
n);
e.key=n;
if(Search(T,e,NULL,p))
数据已经存在!
else
{printf("
数据不存在!
}
case3:
请输入要插入的数据:
已经存在!
else{Insert(T,e);
成功插入!
}
case4:
请输入要删除的数据:
{Deletebit(T,n);
已经成功删除!
elseprintf("
case5:
退出!
default:
选择错误,重新开始!
}while(h!
=5);
(2)二叉排序树的生成模块:
二叉排序树的生成,是从空的二叉排序树开始,每输入一个结点数据,就调用一次插入算法将它插到当前已经生成的二叉排序树中。
voidInit(bitree&
T)//构造一个动态查找表T
intx;
inti;
ElemTypee;
请输入结点个数:
x);
for(i=1;
i<
=x;
i++)
第%d个结点数据值:
"
i);
e.key=n;
Insert(T,e);
二叉排序树已经建立!
(3)二叉排序树的查找模块:
二叉排序树的查找方法如下。
当二叉排序树为空时,查找失败。
当二叉排序树根结点的关键字等于key时,查找成功。
当二叉排序树根结点的关键字大于key时,从根结点的左子树中以同样方法进行查找。
当二叉树根结点的关键字小于key时,从根结点的右子树以同样方法进行查找。
显然,该过程是一个递归过程,下面给出这一算法的实现。
主要代码:
bitreeSearch(bitreeT,ElemTypee,bitreef,bitree&
p)//在二叉排序树中查找数据
if(!
T)
p=f;
returnNULL;
}//查找不成功
elseif(T->
data.key==e.key)
p=T;
returnT;
}//查找成功
data.key>
e.key)
returnSearch(T->
lchild,e,T,p);
elsereturnSearch(T->
rchild,e,T,p);
}//在二叉排序树中查找数据
(4)二叉排序树的插入模块:
若要将一个关键字值为key的结点t插到二叉排序树中,只需要使该结点插入后,二叉排序树中的元素依然按照原来的规律排列即可。
二叉排序树的插入方法如下。
若二叉排序树是空树,则key称为二叉排序树的根。
若二叉排序树为非空,则将key与二叉排序树的根结点进行比较:
如果key的值等于根结点的值,则停止插入;
如果key的值小于根结点的值,则将key插到左子树;
如果key的值大于根结点的值,则将key插到右子树中。
voidInsert(bitree&
T,ElemTypee)//在二叉排序树中插入数据
bitreep,s;
if(!
Search(T,e,NULL,p))//查找不成功
s=(bitree)malloc(sizeof(bitnode));
s->
data=e;
s->
lchild=s->
rchild=NULL;
p)T=s;
//被插入结点*s为新的根结点
elseif(e.key<
p->
data.key)
p->
lchild=s;
//被插结点*s为左孩子
rchild=s;
//被插结点*s为右孩子
(5)多态查找表删除模块:
从二叉排序树中删除一个结点,不能简单地把以该结点为根的子树都删除,只能删除掉该结点,并且还应该保证删除后所得到的二叉树依然满足二叉树的性质不变。
也就是说,在二叉排序树中删除一个结点相当于删除有序序列中的一个结点。
假设要删除的结点为P,其双亲结点为F,同时假设结点P是结点F的左孩子(右孩子的情况类似)。
删除操作首先要确定被删结点P是否在二叉排序树中。
若不在,则不做任何操作;
若在,分为以下三种情况讨论。
若P为叶子结点,可直接将其删除。
若结点P只有左子树,或只有右子树,则可将P的左子树或右子树直接改为其双亲结点F的左子树或右子树。
若P既有左子树,又