动态查找表实验报告.docx

上传人:b****7 文档编号:9404579 上传时间:2023-02-04 格式:DOCX 页数:17 大小:124.66KB
下载 相关 举报
动态查找表实验报告.docx_第1页
第1页 / 共17页
动态查找表实验报告.docx_第2页
第2页 / 共17页
动态查找表实验报告.docx_第3页
第3页 / 共17页
动态查找表实验报告.docx_第4页
第4页 / 共17页
动态查找表实验报告.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

动态查找表实验报告.docx

《动态查找表实验报告.docx》由会员分享,可在线阅读,更多相关《动态查找表实验报告.docx(17页珍藏版)》请在冰豆网上搜索。

动态查找表实验报告.docx

动态查找表实验报告

动态查找表实验报告

一.

1、实验概要

实验项目名称:

抽象数据类型的实现

实验项目性质:

设计性实验

所属课程名称:

数据结构

实验计划学时:

6

2、实验目的

对某个具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据结构,并在此基础上实现该抽象数据类型的全部基本操作。

通过本设计性实验,检验所学知识和能力,发现学习中存在的问题。

进而达到熟练地运用本课程中的基础知识及技术的目的。

实验要求如下:

1.参加实验的学生应首先了解设计的任务,然后根据自己的基础和能力从中选择一题。

一般来说,选择题目应以在规定的时间内能完成,并能得到应有的锻炼为原则。

若学生对教材以外的相关题目较感兴趣,希望选作实验的题目时,应征得指导教师的认可,并写出明确的抽象数据类型定义及说明。

2.实验前要作好充分准备,包括:

理解实验要求,掌握辅助工具的使用,了解该抽象数据类型的定义及意义,以及其基本操作的算法并设计合理的存储结构。

3.实验时严肃认真,要严格按照要求独立进行设计,不能随意更改。

注意观察并记录各种错误现象,纠正错误,使程序满足预定的要求,实验记录应作为实验报告的一部分。

4.实验后要及时总结,写出实验报告,并附所打印的问题解答、程序清单,所输入的数据及相应的运行结果。

所用软件环境或工具:

DEV-C++5可视化编程环境.

 

3.动态查找表的抽象数据类型

ADTDynamicSearchTable{

数据对象D:

D是具有相同特性的数据元素的集合。

每个数据元素含有类型相同的关键字,可唯一

      标识数据元素。

数据关系R:

数据元素同属一个集合。

基本操作P:

InitDSTable(&DT);

操作结果:

构造一个空的动态查找表DT。

DestroyDSTable(&DT);

初始条件:

动态查找表DT存在;

操作结果:

销毁动态查找表DT。

SearchDSTable(DT,key);

初始条件:

动态查找表DT存在,key为和关键字类型相同的给定值;

操作结果:

若DT中存在其关键字等于key的数据元素,则函数值为该元素的值或在表中的位置,否

    则为“空”。

InsertDSTable(&DT,e);

初始条件:

动态查找表DT存在,e为待插入的数据元素;

操作结果:

若DT中不存在其关键字等于e.key的数据元素,则插入e到DT。

DeleteDSTable(&T,key);

初始条件:

动态查找表DT存在,key为和关键字类型相同的给定值;

操作结果:

若DT中存在其关键字等于key的数据元素,则删除之。

TraverseDSTable(DT,Visit());

初始条件:

动态查找表DT存在,Visit是对结点操作的应用函数;

操作结果:

按某种次序对DT的每个结点调用函数visit()一次且至多一次。

一旦visit()失败,则

     操作失败。

}ADTDynamicSearchTable

2.动态查找表的特点

二叉排序树是一种动态树表,其特点是,树的结构通常不是一资生成的,面是在查找过程中,当树中不存在关键字等于给定值的结点时再进行插入。

新插入的结点一定是一个新添加的叶子结点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。

3.算法设计

#include

#include

#include

#include

#include

typedefstructElemType{

intkey;

}ElemType;

typedefstructbitnode{//二叉树的二叉链表存储表示

ElemTypedata;

structbitnode*lchild,*rchild;//左右孩子指针

intlength;

}bitnode,*bitree;

bitreeSearch(bitreeT,ElemTypee,bitreef,bitree&p)//在二叉排序树中查找数据

{

if(!

T)

{

p=f;

returnNULL;

}//查找不成功

elseif(T->data.key==e.key)

{

p=T;returnT;

}//查找成功

elseif(T->data.key>e.key)

returnSearch(T->lchild,e,T,p);

else

returnSearch(T->rchild,e,T,p);

}//在二叉排序树中查找数据

 

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;

if(!

p)T=s;//被插入结点*s为新的根结点

elseif(e.keydata.key)

p->lchild=s;//被插结点*s为左孩子

else

p->rchild=s;//被插结点*s为右孩子

return;

}

elsereturn;

}

voidInit(bitree&T)//构造一个动态查找表T

{intx;

inti;

intn;

ElemTypee;

printf("请输入结点个数:

");

scanf("%d",&x);

for(i=1;i<=x;i++)

{

printf("第%d个结点数据值:

",i);

scanf("%d",&n);

e.key=n;

Insert(T,e);

}

printf("二叉排序树已经建立!

\n");

}

voidDestory(bitreeT)//后序遍历二叉树,销毁动态查找表T

{

if(T)

{if(T->lchild)

DestoryTree(T->lchild);

if(T->rchild)

DestoryTree(T->rchild);

free(T);

T=NULL;

}

}

voidDelete(bitree&p)//从二叉排序树中删除结点p,并重接它的左或右子树

{

bitreeq,s;

if(!

p->rchild)//右子树空,只需重接它的左子树

{

q=p;

p=p->lchild;

free(q);

q=NULL;

}

elseif(!

p->lchild)//左子树空,只需重接它的右子树

{

q=p;

p=p->rchild;

free(q);

q=NULL;

}

else{//左右子树均不空

q=p;

s=p->lchild;

while(s->rchild)//向右走到尽头

{

q=s;

s=s->rchild;

}

p->data=s->data;//将被删结点的前驱s的内容直接替代该结点的内容

if(q!

=p)//若被删除结点的左子树的右子树不为空

q->rchild=s->lchild;//重接*q的右子树

else

q->lchild=s->lchild;//重接*q的左子树

free(s);

s=NULL;

}

}//删除结点

 

voidDeletebit(bitree&T,intn)//删除二叉排序树中的数据

{

if(!

T)

return;//不存在关键字等于n的数据元素

else{

if(T->data.key==n)

return(Delete(T));//找到关键字等于n的数据元素并删除它

elseif(T->data.key>n)

Deletebit(T->lchild,n);//继续在左子树中删除

else

Deletebit(T->rchild,n);//继续在右子树中删除

return;

}

}

 

voidXianxu(bitreeT)//先序遍历

{

if(T!

=NULL)

{

printf("%d\t",T->data.key);

Xianxu(T->lchild);

Xianxu(T->rchild);

}

}

voidZhongxu(bitreeT)//中序遍历

{

if(T!

=NULL)

{

Zhongxu(T->lchild);

printf("%d\t",T->data.key);

Zhongxu(T->rchild);

}

}

voidHouxu(bitreeT)//后序遍历

{

if(T!

=NULL)

{

Houxu(T->lchild);

Houxu(T->rchild);

printf("%d\t",T->data.key);

}

}

intmain()

{bitreeT=NULL,p;

ElemTypee;

intn;

inth;

charc;

do

{

printf("***********************************************************\n");

printf("**\n");

printf("*动态查找表*\n");

printf("*1.建立二叉排序树*\n");

printf("*2.二叉排序树查找元素*\n");

printf("*3.二叉排序树插入元素*\n");

printf("*4.二叉排序树删除元素*\n");

printf("*5.遍历二叉排序树*\n");

printf("*6.销毁二叉排序树*\n");

printf("*7.退出*\n");

printf("**\n");

printf("***********************************************************\n");

printf("请输入你的选择:

\n");

scanf("%d",&h);

switch(h)

{

case1:

Init(T);

break;

case2:

chara;

printf("请输入要查找的数据:

\n");

scanf("%d",&n);

e.key=n;

if(Search(T,e,NULL,p))

printf("数据已经存在!

\n");

else

{printf("数据不存在!

\n");

}

break;

case3:

printf("请输入要插入的数据:

\n");

scanf("%d",&n);

e.key=n;

if(Search(T,e,NULL,p))

printf("已经存在!

\n");

else

{

Insert(T,e);

printf("成功插入!

\n");

}

break;

case4:

printf("请输入要删除的数据:

\n");

scanf("%d",&n);

e.key=n;

if(Search(T,e,NULL,p))

{

Deletebit(T,n);

printf("已经成功删除!

\n");

}

elseprintf("数据不存在!

\n");

break;

case5:

intz;

do{

printf("********************************************************************\n");

printf("**\n");

printf("*遍历二叉排序树*\n");

printf("*1.先序遍历二叉排序树*\n");

printf("*2.中序遍历二叉排序树*\n");

printf("*3.后序遍历二叉排序树*\n");

printf("*4.退出*\n");

printf("**\n");printf("********************************************************************\n");

printf("请输入你的选择:

\n");

scanf("%d",&z);

switch(z)

{

case1:

printf("先序遍历二叉排序树:

");

Xianxu(T);

printf("\n");

break;

case2:

printf("中序遍历二叉排序树:

");

Zhongxu(T);

printf("\n");

break;

case3:

printf("后序遍历二叉排序树:

");

Houxu(T);

printf("\n");

break;

case4:

printf("退出!

返回上级菜单!

\n");

break;

default:

printf("选择错误,重新开始!

\n");

}

}while(z!

=4);

break;

case6:

printf("确定是否要销毁二叉排序树?

(y/n)\n");

scanf("\n%c",&c);

getch();

if(c=='y')

{

Destory(T);

printf("所选数据已成功销毁!

\n");

getch();

T=NULL;}

else

printf("所选数据销毁失败!

\n");

break;

case7:

printf("退出!

\n");

break;

default:

printf("选择错误,重新开始!

\n");

}

}while(h!

=7);

}

4.调试

主页面

 

1.建立二叉排序树

输入十个数据:

10,15,26,96,82,37,46,50,61,03,99

2.查找元素:

26存在则输出

3.插入元素:

 

4.删除元素:

56(不存在)99(存在)

5.遍历:

跳入二级子菜单,里边分别有三种遍历方式可供选择,分别为先序,中序,后序

6.在子菜单中选择4退出则返回到上级菜单,即主页面

7销毁二叉树:

先询问是否确认要销毁,输入y则销毁,输入n则销毁失败

 

说明:

(1)输入十个数据:

10,15,26,96,82,37,46,50,61,03,99

(2)查找26,26存在则输出(3)插入100

(4)删除56和99,56不存在则输出“该数据不存在”,99存在则输出“成功删除”

(5)遍历:

跳入二级子菜单,里边分别有三种遍历方式可供选择

分别是先序:

15,3,13,26,96,82,37,46,50,61,100

中序:

3,13,15,26,37,46,50,100,61,82,96,

后序:

13,3,100,61,50,46,37,82,96,26,15,

退出后则返回到上级菜单

(6)销毁二叉树:

先询问是否确认要销毁,输入Y/y则销毁,输入N/n则销毁失败

 

5.实验总结

这次实验难度不是很大,因为很多算法书本上有,而且我在图书馆里也找了几本数据结构算法实现的书,参考了很多,而且我选择了最简单的二叉树的存储结构来实现。

这次实验使我认识到存储结构和算法实现之间的关连。

存储结构决定算法的实现。

不同的存储结构,在算法的实现方面有很大差别。

例如你选择B树或键树的话相对于我来说就比较困难,因为掌握的不是很好。

很开心自己完成了这次实验,因为这次实验让我多翻了几本书,对动态查找表有了比上课更深的认识,除此之外,我觉得更重要的是我掌握了一些从书上学不到的知识,思想交流和一些处理大问题的一些好方法,就是把大问题模块化和模块规划等等。

还有这次在算法的实现上我最大的困难时在头文件那里,因为很少自己搞编程,所以对于这些也要花费很长时间,说来惭愧,但是还是很开心,通过上网查找,还有师兄师姐的帮助,终于搞定了这个头文件。

所以说以后要多自己动手,动脑。

其实这次在做实验的过程中还有一个体会,那学程序的要先学会看程序,接着是改程序,然后才是写程序,这也是以前的老师告诉我们的。

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

当前位置:首页 > 初中教育 > 科学

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

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