2022年动态查找表实验报告 .pdf
动态查找表实验报告一. 1 、实验概要实验项目名称 : 抽象数据类型的实现实验项目性质 : 设计性实验所属课程名称 : 数据结构实验计划学时 : 6 2、 实验目的对某个具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据结构,并在此基础上实现该抽象数据类型的全部基本操作。通过本设计性实验,检验所学知识和能力,发现学习中存在的问题。进而达到熟练地运用本课程中的基础知识及技术的目的。实验要求如下:1参加实验的学生应首先了解设计的任务,然后根据自己的基础和能力从中选择一题。一般来说,选择题目应以在规定的时间内能完成,并能得到应有的锻炼为原则。若学生对教材以外的相关题目较感兴趣,希望选作实验的题目时,应征得指导教师的认可,并写出明确的抽象数据类型定义及说明。2. 实验前要作好充分准备,包括:理解实验要求,掌握辅助工具的使用,了解该抽象数据类型的定义及意义,以及其基本操作的算法并设计合理的存储结构。3. 实验时严肃认真,要严格按照要求独立进行设计,不能随意更改。注意观察并记录各种错误现象,纠正错误,使程序满足预定的要求,实验记录应作为实验报告的一部分。4. 实验后要及时总结,写出实验报告,并附所打印的问题解答、程序清单,所输入的数据及相应的运行结果。所用软件环境或工具:DEV-C+5可视化编程环境. 3.动态查找表的抽象数据类型ADT DynamicSearchT able 数据对象D:D 是具有相同特性的数据元素的集合。每个数据元素含有类型相同的关键字,可唯一标识数据元素。数据关系R:数据元素同属一个集合。基本操作P:InitDSTable(&DT); 操作结果:构造一个空的动态查找表DT 。DestroyDSTable(&DT); 初始条件:动态查找表DT 存在;操作结果:销毁动态查找表DT 。SearchDSTable(DT, key); 初始条件:动态查找表DT 存在, key 为和关键字类型相同的给定值;操作结果: 若 DT 中存在其关键字等于key 的数据元素, 则函数值为该元素的值或在表中的名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 位置,否则为“空”。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() 失败,则操作失败。 ADT DynamicSearchT able 二 .动态查找表的特点二叉排序树是一种动态树表,其特点是, 树的结构通常不是一资生成的,面是在查找过程中, 当树中不存在关键字等于给定值的结点时再进行插入。新插入的结点一定是一个新添加的叶子结点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。三. 算法设计#include #include #include #include #include typedef struct ElemType int key; ElemType; typedef struct bitnode /二叉树的二叉链表存储表示ElemType data; struct bitnode *lchild,*rchild; /左右孩子指针int length; bitnode,*bitree; bitree Search(bitree T,ElemType e,bitree f,bitree &p)/ 在二叉排序树中查找数据 if(!T) p=f; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - return NULL; /查找不成功else if(T-data.key=e.key) p=T;return T; /查找成功else if(T-data.keye.key) return Search(T-lchild,e,T,p); else return Search(T-rchild,e,T,p); / 在二叉排序树中查找数据void Insert(bitree &T,ElemType e) /在二叉排序树中插入数据 bitree p,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 为新的根结点else if (e.keydata.key) p-lchild=s; /被插结点 *s 为左孩子else p-rchild=s; /被插结点 *s 为右孩子return ; else return ; void Init(bitree &T)/ 构造一个动态查找表T int x; int i; int n; ElemType e; printf(请输入结点个数 : ); scanf(%d,&x); for(i=1;ilchild) DestoryTree(T-lchild); if(T-rchild) DestoryTree(T-rchild); free(T); T=NULL; void Delete(bitree &p)/从二叉排序树中删除结点p,并重接它的左或右子树 bitree q,s; if(!p-rchild) /右子树空,只需重接它的左子树 q=p; p=p-lchild; free(q); q=NULL; else if(!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)/ 若被删除结点的左子树的右子树不为空名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - q-rchild=s-lchild; /重接*q 的右子树else q-lchild=s-lchild; /重接*q 的左子树free(s); s=NULL; /删除结点void Deletebit(bitree &T,int n)/删除二叉排序树中的数据 if(!T) return ; /不存在关键字等于n的数据元素else if(T-data.key=n) return(Delete(T); /找到关键字等于n 的数据元素并删除它else if(T-data.keyn) Deletebit(T-lchild,n); /继续在左子树中删除else Deletebit(T-rchild,n); /继续在右子树中删除return; void Xianxu(bitree T) /先序遍历 if (T!=NULL) printf(%dt,T-data.key); Xianxu (T-lchild); Xianxu (T-rchild); void Zhongxu(bitree T)/中序遍历 if(T!=NULL) Zhongxu (T-lchild); printf(%dt, T-data.key); Zhongxu (T-rchild); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - void Houxu(bitree T)/后序遍历 if(T!=NULL) Houxu (T-lchild); Houxu (T-rchild); printf(%dt, T-data.key); int main() bitree T=NULL,p; ElemType e; int n; int h; char c; 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) case 1: Init(T); break; case 2: char a; printf(请输入要查找的数据 :n); scanf(%d,&n); e.key=n; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - if(Search(T,e,NULL,p) printf( 数据已经存在 !n); else printf( 数据不存在 !n); break; case 3: printf(请输入要插入的数据 :n); scanf(%d,&n); e.key=n; if(Search(T,e,NULL,p) printf( 已经存在 !n); else Insert(T, e); printf( 成功插入 !n); break; case 4: printf(请输入要删除的数据 :n); scanf(%d,&n); e.key=n; if(Search(T,e,NULL,p) Deletebit(T,n); printf( 已经成功删除 !n); else printf( 数据不存在 !n); break; case 5: int z; 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - scanf(%d,&z); switch(z) case 1: printf( 先序遍历二叉排序树: ); Xianxu(T); printf(n); break; case 2: printf(中序遍历二叉排序树 : ); Zhongxu(T); printf(n); break; case 3: printf(后序遍历二叉排序树 : ); Houxu(T); printf(n); break; case 4: printf(退出 !返回上级菜单! n); break; default: printf( 选择错误,重新开始 !n); while(z!=4); break; case 6: printf(确定是否要销毁二叉排序树?(y/n)n); scanf(n%c,&c); getch(); if(c=y) Destory(T); printf( 所选数据已成功销毁 !n); getch(); T = NULL; else printf( 所选数据销毁失败 !n); break; case 7: printf(退出! n); break; default: printf( 选择错误,重新开始 !n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - while(h!=7); 四 .调试主页面1.建立二叉排序树输入十个数据:10,15,26,96,82,37,46,50,61,03,99 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - 2.查找元素 : 26 存在则输出3.插入元素:4.删除元素: 56(不存在)99(存在)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - 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 则销毁失败名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - 五 .实验总结这次实验难度不是很大,因为很多算法书本上有,而且我在图书馆里也找了几本数据结构算法实现的书,参考了很多, 而且我选择了最简单的二叉树的存储结构来实现。这次实验使我认识到存储结构和算法实现之间的关连。存储结构决定算法的实现。不同的存储结构,在算法的实现方面有很大差别。例如你选择B 树或键树的话相对于我来说就比较困难,因为掌握的不是很好。很开心自己完成了这次实验,因为这次实验让我多翻了几本书,对动态查找表有了比上课更深的认识,除此之外, 我觉得更重要的是我掌握了一些从书上学不到的知识,思想交流和一些处理大问题的一些好方法,就是把大问题模块化和模块规划等等。还有这次在算法的实现上我最大的困难时在头文件那里,因为很少自己搞编程,所以对于这些也要花费很长时间,说来惭愧, 但是还是很开心,通过上网查找,还有师兄师姐的帮助,终于搞定了这个头文件。所以说以后要多自己动手,动脑。 其实这次在做实验的过程中还有一个体会, 那学程序的要先学会看程序,接着是改程序, 然后才是写程序,这也是以前的老师告诉我们的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -