收藏 分享(赏)

华中科技大学数据结构实验报告.doc

上传人:精品资料 文档编号:10204737 上传时间:2019-10-19 格式:DOC 页数:70 大小:1.67MB
下载 相关 举报
华中科技大学数据结构实验报告.doc_第1页
第1页 / 共70页
华中科技大学数据结构实验报告.doc_第2页
第2页 / 共70页
华中科技大学数据结构实验报告.doc_第3页
第3页 / 共70页
华中科技大学数据结构实验报告.doc_第4页
第4页 / 共70页
华中科技大学数据结构实验报告.doc_第5页
第5页 / 共70页
点击查看更多>>
资源描述

1、课 程 实 验 报 告课程名称: 数据结构实验 专业班级: 信息安全 201502 学 号: 姓 名: 指导教师: 报告日期: 2016 年 10 月 28 日 计算机科学与技术学院Comment l1: 黑体小 2号加粗居中.间距前后 0.5行Comment l2: 章为宋体小 4号加粗,其余宋体小 4号,行间距 1.5倍,段落前后 0行华中科技大学计算机学院数据结构实验报告目 录1基于顺序存储结构的线性表实现 11.1问题描述 11.2系统设计 11.3系统实现 11.4实验小结 12 基于二叉链表的二叉树实现 22.1问题描述 22.2系统设计 22.3系统实现 22.4实验小结 2指导

2、教师评定意见 3附录 A 基于顺序存储结构线性表实现的源程序 .4附录 B 基于二叉链表二叉树实现的源程序 .5Comment l3: 黑体小 2加粗,居中,间距前后 0.5行Comment l4: 黑体 4号加粗,间距前后 0.5行华中科技大学计算机学院数据结构实验报告11 基于顺序存储结构的线性表实现1.1 问题描述采用顺序表的物理结构,构造一个具有菜单的功能演示系统。其中,在主程序中完成函数调用所需实参值的准备和函数执行结果的显示。定义了线性表的初始化表、销毁表、清空表、判定空表、求表长和获得元素等基本运算对应的函数,并给出适当的操作提示显示,可选择以文件的形式进行存储和加载,即将生成的

3、线性表存入到相应的文件中,也可以从文件中获取线性表进行操作。1.1.1 线性表的基本概念线性表是最常用且最简单的一种数据结构,即 n个数据元素的有限序列。线性表中元素的个数 n定义为线性表的长度,n=0 时成为空表。在非空表中的每个数据元素都有一个确定的位置,如 a1是第一个数据元素,an 是最后一个数据元素,ai 是第 i个数据元素。线性表的存储结构分为线性存储和链式存储。1.1.2 逻辑结构与基本运算线性表的数据逻辑结构定义如下:ADT List 数据对象:D=ai|aiElemSet,i=1,2,n,n0 数据关系:R1= | ai-1,aiD,i=2,n 依据最小完备性和常用性相结合的

4、原则,以函数形式定义了包括线性表的初始化表、加载表、保存表、销毁表、清空表、判定空表、求表长、获得元素、查找元素、获得前驱、获得后继、插入元素、删除元素、遍历表 14 个基本运算,要求分别定义函数来实现上述功能,具体功能运算如下:华中科技大学计算机学院数据结构实验报告2初始化表:函数名称是 InitaList(L);初始条件是线性表 L 不存在已存在;操作结果是构造一个空的线性表。销毁表:函数名称是 DestroyList(L);初始条件是线性表 L 已存在;操作结果是销毁线性表 L。清空表:函数名称是 ClearList(L);初始条件是线性表 L 已存在;操作结果是将 L 重置为空表。判定

5、空表:函数名称是 ListEmpty(L);初始条件是线性表 L 已存在;操作结果是若 L 为空表则返回 TRUE,否则返回 FALSE。求表长:函数名称是 ListLength(L);初始条件是线性表已存在;操作结果是返回 L 中数据元素的个数。获得元素:函数名称是 GetElem(L,i,e);初始条件是线性表已存在,1iListLength(L);操作结果是用 e 返回 L 中第 i 个数据元素的值。查找元素:函数名称是 LocateElem(L,e,compare();初始条件是线性表已存在;操作结果是返回 L 中第 1 个与 e 满足关系 compare()关系的数据元素的位序,若这

6、样的数据元素不存在,则返回值为 0。获得前驱:函数名称是 PriorElem(L,cur_e,pre_e);初始条件是线性表L 已存在;操作结果是若 cur_e 是 L 的数据元素,且不是第一个,则用 pre_e返回它的前驱,否则操作失败,pre_e 无定义。获得后继:函数名称是 NextElem(L,cur_e,next_e);初始条件是线性表L 已存在;操作结果是若 cur_e 是 L 的数据元素,且不是最后一个,则用next_e 返回它的后继,否则操作失败,next_e 无定义。插入元素:函数名称是 ListInsert(L,i,e);初始条件是线性表 L 已存在且非空,1iListLe

7、ngth(L)+1;操作结果是在 L 的第 i 个位置之前插入新的数据元素 e。删除元素:函数名称是 ListDelete(L,i,e);初始条件是线性表 L 已存在且非空,1iListLength(L);操作结果:删除 L 的第 i 个数据元素,用 e返回其值。遍历表:函数名称是 ListTraverse(L,visit(),初始条件是线性表 L已存在;操作结果是依次对 L 的每个数据元素调用函数 visit()。Comment l5: 黑体 4号加粗,间距前后 0.5行华中科技大学计算机学院数据结构实验报告31.1.3 演示系统与数据文件要求构造一个具有菜单的功能演示系统。其中,在主程序中

8、完成函数调用所需实参值的准备和函数执行结果的显示,并给出适当的操作提示显示。附录 A 提供了简易菜单的框架。 演示系统可选择实现线性表的文件形式保存。其中,需要设计文件数据记录格式,以高效保存线性表数据逻辑结构(D,R)的完整信息;需要设计线性表文件保存和加载操作合理模式。附录 B 提供了文件存取的方法。 演示系统可选择实现多个线性表管理。1.2 系统设计1.2.1 数据物理结构线性表的数据物理结构如下:typedef struct /顺序表(顺序结构)的定义 ElemType *elem; /定义整型指针,为存储空间基址 int length; /线性表的长度 int listsize; /

9、当前分配的存储容量 (以 sizeof(ElemType)为单位) SqList;要实现同时对多个线性表管理,只需要定义一个结构数组即可。1.2.2 演示系统将菜单演示和用户选择写入到 while循环中,用 OP获取用户的选择,OP 初始化为 1,以便第一次能进入循环。进入循环后系统首先显示功能菜单,然后用户输入选择 0-14,其中 1-14分别代表线性表的一个基本运算,在主函数中通过 SWITCH语句对应到相应的函数功能,执行完该功能后 BREAK跳出 SWITCH语句,继续执行 while循环,直至用户输入 0退出当前演示系统。在第一次进入循环 while时首先会询问用户对哪个线性表进行操

10、作,直至退出演示系统之华中科技大学计算机学院数据结构实验报告4前一直对指定线性表进行操作。演示系统结构如图 1-1.1.2.3 运算算法思想与设计线性表运算算法思想与设计如下:1. 初始化线性表思想:将线性表初始化过程写成函数,其中传入函数的参数是主函数中定义的结构型变量 L 的引用,在函数中,首先使用 malloc函数分配 LISTSIZE 大小的连续内存空间,并将首地址返回赋值给L.elem,由于线性表的长度为 0,将 L.length 初始化为 0,即完成了线性表的初始化。经分析,算法的时间复杂度为 O(1)。2. 销毁线性表思想:将销毁线性表的过程写成函数,其中传入函数是主函数中定义的

11、结构性变量 L。在函数中,首先使用 free 函数释放掉以L.elem 为首地址的连续内存空间,再将 L.length,L.listsize 重新赋值为 0。经分析,该算法的时间复杂度为 O(1)。3. 清空线性表的思想:将清空表的过程写成函数,其中将主函数中定义的结构性变量 L 的引用作为函数参数,在函数中,由于清空操作并不释放内存空间,故只需将线性表的长度置为 0 即可。经分许,该算法的时间复杂度为 O(1)。4. 求线性表表长的思想:将求表长过程写成函数,其中主函数中定义的结构性变量 L 的引用作为函数的参数,在函数中,直接返回 L.length 即为所求线性表的表长。经分析,该算法的时

12、间复杂度为 O(1) 。5. 获得元素的算法思想:将获得线性表元素写成函数,其中函数的参数是华中科技大学计算机学院数据结构实验报告5结构型变量 L 以及数据元素的序号 i,由于采取的是线性存储结构,故直接通过访问数组的方式即 L.elemi-1来获取元素,当然,在这之前需要判断合法性。经分析,该算法的时间复杂度为 O(1) 。6. 查找元素的算法思想:将查找线性表特定值的数据元素写成函数,其中函数的参数是主函数中定义的结构类型变量 L 以及查找的数据元素的值,通过循环对线性表中的每一个元素与给定值比较看是否相等,如果相等就返回该元素的次序。经分析,该算法的时间复杂度为 O(n) 。查找算法的流

13、程图如图 1-2 所示。图 1-2 线性表查找算法流程图7. 获得前驱算法思想:将获得前驱过程写成函数,函数的参数是结构体类型变量以及特定数据元素的值,接受前驱的变量作为另一个参数,首先调用获得元素的函数判断该线性表中特定数据元素的位序,首先判断不为 1,否则的话返回 FALSE,然后直接返回其前一个元素即 L.elemj-2。经分析,该算法的时间复杂度为 O(n) 。8. 获得后继算法思想:将获得后继写成函数,函数的参数是结构体类型变量以及特定数据元素的值。首先判断是否为最后一个元素,如果不是则直接返回其后一个元素,否则的话返回 FALSE,同样该算法需要调用获得元素的函数来确定该特定元素在

14、线性表中的次序。经分析,该算法的时间复杂度为 O(n) 。华中科技大学计算机学院数据结构实验报告69. 插入元素算法思想:将插入函数写成函数,函数的参数是结构型变量以及插入元素的值大小以及插入位置。在函数中,首先判断插入位置的合法性,即是否在线性表中合适的位置,其次还要判断当前存储空间是否已满,如果满了的话要 malloc 函数重新分配空间,插入元素时从该位置起到最后一个元素从后开始以此往后移一个单元。经分析,该算法的时间复杂度为 O(n) 。该算法的程序流程图如图 1-3 所示。图 1-3 线性表中插入元素算法流程图10. 删除元素算法思想:将删除线性表中元素写成函数,函数的参数是结构类型变

15、量,首先判断位序的合法性,在之后直接将删除元素位置后一个元素直到最后一个元素以此从前往后向前移动一个单元。经分析,该算Comment l6: 图内容:字体大小参考宋体 5号,居中Comment l7: 黑体 4号加粗,间距前后 0.5行华中科技大学计算机学院数据结构实验报告7法的时间复杂度为 O(n) 。11.遍历线性表算法思想:将遍历线性表写成一个函数,函数的参数是结构类型变量,直接用一个循环来对线性表中的每一个元素进行操作。经分析,该算法的时间复杂度为 O(n)。1.3 系统实现1.3.1 编程环境、运行环境、项目工程描述本次实验采用 Microsoft Visual Studio 201

16、5编程软件编写,并用 VS2015进行编译运行,项目名称是 linear datastructer。1.3.2 头文件及预定义常量说明1.头文件#include #include #include 2.预定义常量#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASTABLE -1#define OVERFLOW -2#define LIST_INIT_SIZE 100#define LISTINCREMENT 103.类型表达式typedef int status;typedef int ElemType;

17、1.3.3 系统演示操作1.系统一开始会显示菜单提示用户输入选择对1-99号线性表哪一个进行操作。如图1-4所示。华中科技大学计算机学院数据结构实验报告8图1-4 系统演示12.选择对线性表1进行操作,进入菜单演示界面,如图1-5所示。图1-5 系统演示23.选择退出0,此时会退出当前演示界面,即退出对当前线性表的操作,并显示要求用户选择对哪一个线性表进行操作。如图1-6所示。华中科技大学计算机学院数据结构实验报告9图1-6 演示系统34.输入0,退出演示系统,结束操作,如图1-7所示。图1-7 系统演示41.3.4 测试计划测试功能及序号 输入要管理的线性表序号输入函数的参数(具体元素)预计

18、输出 此时线性表的状态1.IntiaList 1 无 线性表初始化成功分配了连续的物理存储空间,表长度为0,表尺寸为空间大华中科技大学计算机学院数据结构实验报告10小2.DestroyList 1 无 线性表删除成功线性表连续物理空间被释放,3.ClearList 1 无 线性表清空成功线性表的物理空间保留,但表长置为0.10.ListInsert(多次调用)1输入1:1,2:2,3:3,4:4,5:5线性表创建成功创建了一个线性表,序列为:1,2,3,4,54.ListEmpty 1 无 输出线性表非空同上5.ListLength 1 无输出线性表的长度为5 同上6.GetElem 1输入数

19、据元素的位序为3输出线性表的第三个元素为3 同上8.PriorElem 1输入数据元素的值为4输出4的前面一个元素是3 同上9.NextElem 1输入数据元素的值为2输出2的后面一个元素是3 同上11.ListDelete 1输入数据元素的置为3输出元素删除成功重新生成了一新的线性表,序列为12457.LocateElem 1输入数据元素的值为4输出4是线性表中的第三个数据元素同上13.SaveData 1输入保存到的文件名为LY.txt输出文件保存成功 同上14.DataLoading 1输入要加载的文件名为LY.txt输出文件加载成功 同上华中科技大学计算机学院数据结构实验报告111.3

20、.5 测试1.输入对线性表 1 进行操作,进入菜单演示界面,执行功能 1,初始化线性表,测试结果如图 1-8 所示。图 1-8 初始化线性表的测试结果2.执行功能 2,销毁线性表,测试结果如图 1-9 所示。图 1-9 删除线性表的操作结果3.执行功能 10,往线性表中添加数据元素 1,2,3,4,5,测试结果如图 1-10 所示。华中科技大学计算机学院数据结构实验报告12图 1-10 插入元素的测试结果4.执行功能 4,判断线性表是否为空,测试结果如图 1-11 所示。图 1-11 判断线性表非空的测试结果5.执行功能 5,求线性表的长度,测试结果如图 1-12 所示。华中科技大学计算机学院

21、数据结构实验报告13图 1-12 求线性表长度的测试结果6.执行功能 6,查找第三个数据元素的数值,测试结果如图 1-13 所示。图 1-13 查找数据元素的测试结果7.执行功能 8,确定值为 4 的数据元素前驱数据元素,测试结果如图 1-14 所示。华中科技大学计算机学院数据结构实验报告14图 1-14 查找元素的前驱数据元素8.执行功能 9,确定值为 2 的数据元素的后继数据元素,测试结果如图 1-15 所示。1-15 查找元素的后继数据元素9.执行功能 11,删除第三个数据元素,测试结果如图 1-16 所示。华中科技大学计算机学院数据结构实验报告15图 1-16 删除线性表中的数据元素测

22、试结果10.执行功能 13,保存线性表中的数据元素值到文件名为 LY.txt 的文件中,测试结果如图 1-17 所示。图 1-17 保存线性表测试结果11.清空此时的线性表,在执行功能 14,加载线性表,测试结果如图 1-18 所示。Comment l8: 黑体 4号加粗,间距前后 0.5行华中科技大学计算机学院数据结构实验报告16图 1-18 线性表加载的测试结果11.执行功能 12,遍历并输出线性表中的元素,应该输出 1245,测试结果如图1-19所示。图 1-19 遍历输出线性表中元素的测试结果1.4 实验小结经过本次试验,我充分了解到了线性表的物理结构,并且通过切身的体会熟练掌握了线性

23、表的基本操作,提高了自己写有关线性表的代码的能力,尤其是在写的过程中遇到了许多困难,在多次寻求同学的帮助下终于解决了。还发现了自己的薄弱之处,就是在文件的处理时存在许多纰漏,导致文件读取不成功。并且我还加深了对线性表的存在与空的区别。还有对“(3) 若 D1,则 D1中存在唯一的元素 X1,H,且存在 D1上的关系 H1包含于 H;若 Dr,则 Dr中存在唯一的元素 Xr,H,且存在 Dr上的关系属于 H;(4) (D,H1)是一棵符合本定义的二叉树,称为根的左子树,华中科技大学计算机学院数据结构实验报告18(Dr,Hr)是一棵符合本定义的二叉树,称为根的右子树。依据最小最小完备性和常用性相结

24、合的原则,以函数形式定义了二叉树的初始化、销毁二叉树、创建二叉树、清空二叉树、判定空二叉树和求二叉树深度等 20 种基本运算,具体运算功能定义如下:初始化二叉树:函数名称是 InitBiTree(T);初始条件是二叉树 T 不存在;操作结果是构造空二叉树 T。销毁二叉:树函数名称是 DestroyBiTree(T);初始条件是二叉树 T 已存在;操作结果是销毁二叉树 T。创建二叉树:函数名称是 CreateBiTree(T,definition);初始条件是definition 给出二叉树 T 的定义;操作结果是按 definition 构造二叉树 T。清空二叉树:函数名称是 ClearBiT

25、ree (T);初始条件是二叉树 T 存在;操作结果是将二叉树 T 清空。判定空二叉树:函数名称是 BiTreeEmpty(T);初始条件是二叉树 T 存在;操作结果是若 T 为空二叉树则返回 TRUE,否则返回 FALSE。求二叉树深度:函数名称是 BiTreeDepth(T);初始条件是二叉树 T 存在;操作结果是返回 T 的深度。获得根结点:函数名称是 Root(T);初始条件是二叉树 T 已存在;操作结果是返回 T 的根。获得结点:函数名称是 Value(T,e);初始条件是二叉树 T 已存在,e 是T 中的某个结点;操作结果是返回 e 的值。结点赋值:函数名称是 Assign(T,s

26、truct BiTNode *lchild, *rchild;/左右孩子指针int index;BiTNode,*BiTree;/typedef是将结构类型定义 struct BiTNode取别名为 BiTNode2.2.2 演示系统将菜单演示和用户选择输入写入到 while循环中,用 op获取用户的选择。Op初始化为 1,以便第一次能进入循环。进入 while循环后,系统首先显示功能菜单,然后提示用户输入选择(0-20) ,其中 1-20对应二叉树的一个基本操作,分别对应一个函数,通过 switch语句将用户输入的序号对应到相应的函数功能,执行完该语句后 break跳出 switch语句,执

27、行 while循环,直到用户输入 0选择退出,退出系统。华中科技大学计算机学院数据结构实验报告21图 2-1 系统设计结构图2.2.3 运算算法思想与设计二叉树运算算法思想与设计如下:1、 初始化二叉树算法思想:将初始化二叉树过程写成函数,函数的参数是主函数中所定义的结构类型指针 T(参数传递为引用方式,即取别名) ,T 所指向的是二叉树的根结点,将 T 赋值为 NULL 即完成了二叉树的初始化。经分析,该算法的时间复杂度为 O(1)。2、 销毁二叉树算法思想:将二叉树的销毁过程写成函数,函数的参数是指向二叉树根结点的结构类型指针 T,采取递归的方式先销毁二叉树的左子树,在销毁二叉树的右子树,

28、最后用 free 函数释放掉根结点对应的内存空间。经分析,该算法的时间复杂度为 O(n)。3、 创建二叉树算法思想:将二叉树的创建过程写成函数,函数的参数是指向二叉树根结点的结构类型指针 T,按照先序次序输入二叉树中结点的值,如果第一个字符为#,则 T 为空二叉树。否则,malloc 函数分配一个单元的空间作为树的根结点,并为其赋值,采取递归的方式继续创建根结点的左子树和右子树。经分析,该算法的时间复杂度为 O(n)。4、 清空二叉树算法思想:将二叉树的清空过程写成函数,函数的参数同上,将根结点的左右孩子指针置为空,此时其左右子树的存储空间并未释放掉。经分析,该算法的时间复杂度为 O(1)。5

29、、 判定空二叉树的算法思想:将判定空二叉树写成函数,对于一个二叉树,若根结点不存在则为空二叉树,否则不是空二叉树,那么只需要判断指向根结点的结构类型指针 T 是否为空即可。经分析,该算法的时间复杂华中科技大学计算机学院数据结构实验报告22度为 O(1)。6、 求二叉树的深度算法思想:将求二叉树的深度写成函数,采取递归的方式求二叉树的深度,如果根结点的左右孩子都不存在,则返回树的深度为 1,否则的话返回根结点左右子树的深度的最大加上一。经分析,该算法的时间复杂度为 O(n)。7、 获得二叉树根结点的算法思想:将求二叉树根结点写成函数,传入头结点,若其头指针不为空,则返回该结点的关键字信息。经分析

30、,该算法的时间复杂度为 O(1)。8、 获得结点的算法思想是:将获得关键字结点写成函数,函数的参数是二叉树的头指针以及主函数中输入的关键字,通过递归先序遍历二叉树,即先比较根结点的关键字与给定是否一致,若一致,返回该结点的INDEX 值,否则继续分别递归遍历其左子树和右子树。或者采取非递归的方式,即使用堆栈来存储根结点的信息,先将根结点入栈,在循环中弹出栈顶元素,比较关键字,在分别将其右子树和左子树的根结点入栈。经分析,该算法的时间复杂度为 O(n)。9、 结点赋值的算法思想是:将结点赋值写成函数,函数的参数是二叉树的头指针,主函数中输入的关键字,根据关键字获取到根结点,并对根结点赋值,思想同

31、 8,不在赘述。经分析,该算法的时间复杂度为 O(n)。10、 获得双亲结点的算法思想是:将获得双亲结点写成函数,函数的参数是二叉树的头指针,若头指针为空,则返回空;否则,如果头指针左孩子或右孩子不为空且关键字与给定关键字相同,返回根结点,如果不同,采取递归的方式调用原函数,传入的参数分别为根结点的左右子树的根结点。经分析,该算法的时间复杂度为 O(n)。11、 获得左兄弟结点的算法思想是:将获得左孩子结点写成函数,函数的参数是二叉树的头指针,如果头指针为空,返回 NULL;否则,如果二叉树的根结点的右孩子关键字与给定关键字一致,返回根结点的左孩子。如果不一致,继续递归调用原函数,传入的参数为

32、二叉树根结点的左子树的根结点指针,如果函数的返回值非空,则返回该值,否则继续调用原函数,传入的参数是二叉树根结点的右子树的根结点指针,如果函数的返回值为非空,则返回该值,否则返回 NULL。经分析,该算法的时间复杂度为 O(n)。12、 获得右兄弟结点的算法思想是:算法思想同上。经分析,该算法的时间复杂度为 O(n)。13、 获得左孩子结点的算法思想是:将获得左孩子结点写成函数,函数的参数是二叉树的头指针。如果根结点的关键字与给定关键字一致,且其左孩子存在,则返回其左孩子关键字,否则递归调用原函数分别将根结点的左右子树根结点指针作为形参,若返回值非空则返回该值。经分析,该算法的时间复杂度为 O

33、(n)。14、 获得右孩子结点的算法思想是:算法思想同上。经分析,该算法的时间复杂度为 O(n)。15、 插入子树的算法思想是:将插入子树写成函数,函数的形参是二叉树的头指针 T,指向特定二叉树结点的指针 p(在主函数中要求输入关键字,通过 FIND 函数找到插入点位置并将其值记录) ,再调用CreateBiTNode 函数创建根结点 c 的右子树为空的二叉树,插入的过程Comment l12: 黑体 4号加粗,间距前后 0.5行华中科技大学计算机学院数据结构实验报告23即将 P所指向结点的左子树或者右子树根结点指针赋值给 c的右孩子指针域,而 c赋值给 p所指结点的左指针域或者右指针域。经分

34、析,该算法的时间复杂度为 O(n)。16、 删除子树的算法思想是:将删除子树写成函数,函数的形参是二叉树的头指针,特定结点的指针,根据指向特定结点的指针找到给结点并将其左右孩子指针域置为空,对应的还应该在这之前调用 DESTROY函数将其左子树或右子树销毁。经分析,该算法的时间复杂度为 O(n)。17、 前序遍历的算法思想是:将前序遍历写成函数,函数的形参是二叉树的头指针,首先访问根结点,并对其执行遍历操作,操作成功后采取递归的方式遍历根结点的左子树,返回值为 OK时继续遍历其右子树,最终遍历完成。递归方法前序遍历、中序遍历以及后序遍历的根本区别在与访问根结点的操作是在两次递归操作之间之前还是

35、之后。经分许,该算法的时间复杂度为 O(n)。18、 非递归前序遍历的算法思想是:将非递归前序遍历写成函数,函数的形参是二叉树的头指针,仿照递归过程堆栈的使用,首先将根结点的值压入堆栈,执行循环体,堆栈非空,弹出根结点并执行访问操作,将其右子树根结点指针压入堆栈,再将其左子树根结点指针压入堆栈,执行循环。经分析,该算法的时间复杂度为 O(n)。19、 非递归中序遍历的算法思想是:将非递归中序遍历写成函数,函数的形参是二叉树的头指针,首先将根结点的值压入堆栈,然后一直向左,将根结点依次压入堆栈,判断堆栈非空,将栈顶元素弹出,访问该结点,如果其右子树非空,对其右子树执行循环操作。经分析,该算法的时

36、间复杂度为 O(n)。20、 层序遍历的算法思想是:将层序遍历写成函数,函数的形参是二叉树的头指针,借助队列,使根结点进入队列,根结点出队列,执行访问操作,此时将根结点的左右子树根结点依次进入队列,即队列中的某个元素出队列时将其左右子树根结点放进队列,循环即可一层一层的访问二叉树。经分析,该算法的时间复杂度为 O(n)。2.3 系统实现2.3.1 编程环境、运行环境、项目工程描述本次实验采用 Microsoft Visual Studio 2015编程软件编写,并用 VS2015进行编译运行,项目名称是 BinaryTree。2.3.2 头文件及预定义常量说明1、头文件#include #in

37、clude #include 2、预定义常量(1)函数结果状态宏定义#define TRUE 1华中科技大学计算机学院数据结构实验报告24#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2(2)类型表达式typedef int status;typedef char TElemType;typedef BiTree QElemType;(3)系统常量定义#define MAXLENG 10#define MAXSIZE 2#define QMAXSIZE 52.3.3 演示系统操作1.系统一开始会显示功能菜单并提示用户输入

38、选择。图2-2 演示系统操作图12.输入序号020,会执行序号所对应的操作。华中科技大学计算机学院数据结构实验报告25图2-3 演示系统操作图23.输入序号0,演示系统结束并退出。图2-3 演示系统操作图32.3.4 测试计划测试功能及序号 输入函数的参数 预计输出 此时二叉树的状态1.InitBiTree 无 二叉树创建成功二叉树根结点指针置为空,未分配具体的存储空间华中科技大学计算机学院数据结构实验报告262.DestroyBiTree 无 二叉树销毁失败二叉树头指针置为空,对应的存储空间被释放3.CreateBiTree依次输入关键字及其对应值:A1 B9 D7 #E0H1#I2#C9F

39、6#G2#J0#二叉树创建成功按照输入关键字的先序序列创建二叉树,每个结点赋值4.ClearBiTree 无 二叉树清空成功二叉树根结点保留,但其左右指针域置为空5.BiTreeEmpty 无 二叉树不为空 同上 36.BiTreeDepth 无 二叉树的深度为 4 同上 37.Root 无二叉树的根结点关键字为 A 同上 38.Value 输入关键字为 D输出关键字为 D 的结点值为 7 同上 39.Assign输入关键字 E输入关键字为 E 的结点的值改为 9输出关键字为 E 的结点的值已改为 9 同上 310.Parent 输入查找关键字为 I 的结点输出关键字为 I 的结点的双亲结点为

40、E同上 311.LeftChild(测试 1) 输入查找关键字为 E 的结点输出关键字为 E 的结点的左孩子为 H 同上 312.LeftChild(测试2)输入查找关键字为 F 的结点输出关键字为 F 的左孩子不存在,查找失败同上 313.RightChild(测试1)输入查找关键字为 B 的结点输出关键字为 B 的结点右孩子为 E 同上 314.RightChild(测试2)输入查找关键字为 F 的结点输出关键字为 F 的右孩子不存在,操作失败同上 315.LeftSibling(测试1)输入查找关键字为 G 的结点输出关键字为 G 的结点左孩子为 F 同上 315.LeftSibling

41、(测试2)输入查找关键字为 B 的结点输出关键字为 B 的结点左孩子不存在,操作失败同上 3华中科技大学计算机学院数据结构实验报告2716.InsertChild输入 LR 值为 0,输入查找关键字为 J,新生成右子树为空的二叉树输入:M1N2#K3#(字母后为该关键字结点的值)输出二叉树插入成功在原二叉树的基础上,将新生成二叉树作为关键字为 J 的结点的左子树,J 的左子树作为新生成二叉树的右子树17.DeleteChild输入查找关键字为 E 的结点,输入 LR 值为 1输出二叉树删除成功在上一基础上,将原二叉树的 E结点的右子树删除18.PreOrderTraverse 无输出先序遍历序

42、列:ABDEHICFGJ 同上 319.InOrderTraverse 无输出中序遍历序列:DBHEIAFCGJ 同上 320.PostOrderTraverse 无输出后续遍历序列:DHIEBFJGCA 同上 321.LevelTraverse 无输出层序遍历序列:ABCDEFGHIJ 同上 3表 2-1 测试计划图 2-4 按以上测试用例生成的原始二叉树华中科技大学计算机学院数据结构实验报告282.3.5 测试1.执行功能 1.InitBiTree,测试结果如图 2-5 所示。图 2-5 初始化二叉树测试2.执行功能 3,创建二叉树,测试结果如图 2-6 所示。图 2-6 二叉树创建3.在上一步的基础上对二叉树的结构进行验证,根据其前序遍历、中序遍历、后续遍历的结果是否与预期一致判断结构是否正确。执行功能 17,先序遍历二叉树,并执行 PRINT 操作,测试结果如图 2-7 所示。

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报