华中科技大学数据结构实验报告文档格式.docx
《华中科技大学数据结构实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《华中科技大学数据结构实验报告文档格式.docx(74页珍藏版)》请在冰豆网上搜索。
![华中科技大学数据结构实验报告文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/20/3d00bef6-b5c8-406c-83aa-a64537f48d67/3d00bef6-b5c8-406c-83aa-a64537f48d671.gif)
演示系统可选择实现多个线性表管理。
1.2系统设计
1.2.1数据物理结构
线性表的数据物理结构如下:
typedefstruct{//顺序表(顺序结构)的定义
ElemType*elem;
//定义整型指针,为存储空间基址
intlength;
//线性表的长度
intlistsize;
//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
要实现同时对多个线性表管理,只需要定义一个结构数组即可。
1.2.2演示系统
将菜单演示和用户选择写入到while循环中,用OP获取用户的选择,OP初始化为1,以便第一次能进入循环。
进入循环后系统首先显示功能菜单,然后用户输入选择0-14,其中1-14分别代表线性表的一个基本运算,在主函数中通过SWITCH语句对应到相应的函数功能,执行完该功能后BREAK跳出SWITCH语句,继续执行while循环,直至用户输入0退出当前演示系统。
在第一次进入循环while时首先会询问用户对哪个线性表进行操作,直至退出演示系统之前一直对指定线性表进行操作。
演示系统结构如图1-1.
1.2.3运算算法思想与设计
线性表运算算法思想与设计如下:
1.初始化线性表思想:
将线性表初始化过程写成函数,其中传入函数的参数是主函数中定义的结构型变量L的引用,在函数中,首先使用malloc函数分配LISTSIZE大小的连续内存空间,并将首地址返回赋值给L.elem,由于线性表的长度为0,将L.length初始化为0,即完成了线性表的初始化。
经分析,算法的时间复杂度为O
(1)。
2.销毁线性表思想:
将销毁线性表的过程写成函数,其中传入函数是主函数中定义的结构性变量L。
在函数中,首先使用free函数释放掉以L.elem为首地址的连续内存空间,再将L.length,L.listsize重新赋值为0。
经分析,该算法的时间复杂度为O
(1)。
3.清空线性表的思想:
将清空表的过程写成函数,其中将主函数中定义的结构性变量L的引用作为函数参数,在函数中,由于清空操作并不释放内存空间,故只需将线性表的长度置为0即可。
经分许,该算法的时间复杂度为O
(1)。
4.求线性表表长的思想:
将求表长过程写成函数,其中主函数中定义的结构性变量L的引用作为函数的参数,在函数中,直接返回L.length即为所求线性表的表长。
5.获得元素的算法思想:
将获得线性表元素写成函数,其中函数的参数是结构型变量L以及数据元素的序号i,由于采取的是线性存储结构,故直接通过访问数组的方式即L.elem[i-1]来获取元素,当然,在这之前需要判断合法性。
6.查找元素的算法思想:
将查找线性表特定值的数据元素写成函数,其中函数的参数是主函数中定义的结构类型变量L以及查找的数据元素的值,通过循环对线性表中的每一个元素与给定值比较看是否相等,如果相等就返回该元素的次序。
经分析,该算法的时间复杂度为O(n)。
查找算法的流程图如图1-2所示。
图1-2线性表查找算法流程图
7.获得前驱算法思想:
将获得前驱过程写成函数,函数的参数是结构体类型变量以及特定数据元素的值,接受前驱的变量作为另一个参数,首先调用获得元素的函数判断该线性表中特定数据元素的位序,首先判断不为1,否则的话返回FALSE,然后直接返回其前一个元素即L.elem[j-2]。
8.获得后继算法思想:
将获得后继写成函数,函数的参数是结构体类型变量以及特定数据元素的值。
首先判断是否为最后一个元素,如果不是则直接返回其后一个元素,否则的话返回FALSE,同样该算法需要调用获得元素的函数来确定该特定元素在线性表中的次序。
9.插入元素算法思想:
将插入函数写成函数,函数的参数是结构型变量以及插入元素的值大小以及插入位置。
在函数中,首先判断插入位置的合法性,即是否在线性表中合适的位置,其次还要判断当前存储空间是否已满,如果满了的话要malloc函数重新分配空间,插入元素时从该位置起到最后一个元素从后开始以此往后移一个单元。
该算法的程序流程图如图1-3所示。
图1-3线性表中插入元素算法流程图
10.删除元素算法思想:
将删除线性表中元素写成函数,函数的参数是结构类型变量,首先判断位序的合法性,在之后直接将删除元素位置后一个元素直到最后一个元素以此从前往后向前移动一个单元。
11.遍历线性表算法思想:
将遍历线性表写成一个函数,函数的参数是结构类型变量,直接用一个循环来对线性表中的每一个元素进行操作。
1.3系统实现
1.3.1编程环境、运行环境、项目工程描述
本次实验采用MicrosoftVisualStudio2015编程软件编写,并用VS2015进行编译运行,项目名称是lineardatastructer。
1.3.2头文件及预定义常量说明
1.头文件
#include<
stdio.h>
malloc.h>
stdlib.h>
2.预定义常量
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASTABLE-1
#defineOVERFLOW-2
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
3.类型表达式
typedefintstatus;
typedefintElemType;
1.3.3系统演示操作
1.系统一开始会显示菜单提示用户输入选择对1-99号线性表哪一个进行操作。
如图1-4所示。
图1-4系统演示1
2.选择对线性表1进行操作,进入菜单演示界面,如图1-5所示。
图1-5系统演示2
3.选择退出0,此时会退出当前演示界面,即退出对当前线性表的操作,并显示要求用户选择对哪一个线性表进行操作。
如图1-6所示。
图1-6演示系统3
4.输入0,退出演示系统,结束操作,如图1-7所示。
图1-7系统演示4
1.3.4测试计划
测试功能及序号
输入要管理的线性表序号
输入函数的参数(具体元素)
预计输出
此时线性表的状态
1.IntiaList
1
无
线性表初始化成功
分配了连续的物理存储空间,表长度为0,表尺寸为空间大小
2.DestroyList
线性表删除成功
线性表连续物理空间被释放,
3.ClearList
线性表清空成功
线性表的物理空间保留,但表长置为0.
10.ListInsert(多次调用)
输入1:
1,2:
2,3:
3,4:
4,5:
5
线性表创建成功
创建了一个线性表,序列为:
1,2,3,4,5
4.ListEmpty
输出线性表非空
同上
5.ListLength
输出线性表的长度为5
6.GetElem
输入数据元素的位序为3
输出线性表的第三个元素为3
8.PriorElem
输入数据元素的值为4
输出4的前面一个元素是3
9.NextElem
输入数据元素的值为2
输出2的后面一个元素是3
11.ListDelete
输入数据元素的置为3
输出元素删除成功
重新生成了一新的线性表,序列为1245
7.LocateElem
输出4是线性表中的第三个数据元素
13.SaveData
输入保存到的文件名为LY.txt
输出文件保存成功
14.DataLoading
输入要加载的文件名为LY.txt
输出文件加载成功
1.3.5测试
1.输入对线性表1进行操作,进入菜单演示界面,执行功能1,初始化线性表,测试结果如图1-8所示。
图1-8初始化线性表的测试结果
2.执行功能2,销毁线性表,测试结果如图1-9所示。
图1-9删除线性表的操作结果
3.执行功能10,往线性表中添加数据元素1,2,3,4,5,测试结果如图1-10所示。
图1-10插入元素的测试结果
4.执行功能4,判断线性表是否为空,测试结果如图1-11所示。
图1-11判断线性表非空的测试结果
5.执行功能5,求线性表的长度,测试结果如图1-12所示。
图1-12求线性表长度的测试结果
6.执行功能6,查找第三个数据元素的数值,测试结果如图1-13所示。
图1-13查找数据元素的测试结果
7.执行功能8,确定值为4的数据元素前驱数据元素,测试结果如图1-14所示。
图1-14查找元素的前驱数据元素
8.执行功能9,确定值为2的数据元素的后继数据元素,测试结果如图1-15所示。
1-15查找元素的后继数据元素
9.执行功能11,删除第三个数据元素,测试结果如图1-16所示。
图1-16删除线性表中的数据元素测试结果
10.执行功能13,保存线性表中的数据元素值到文件名为LY.txt的文件中,测试结果如图1-17所示。
图1-17保存线性表测试结果
11.清空此时的线性表,在执行功能14,加载线性表,测试结果如图1-18所示。
图1-18线性表加载的测试结果
11.执行功能12,遍历并输出线性表中的元素,应该输出1245,测试结果如图1-19所示。
图1-19遍历输出线性表中元素的测试结果
1.4实验小结
经过本次试验,我充分了解到了线性表的物理结构,并且通过切身的体会熟练掌握了线性表的基本操作,提高了自己写有关线性表的代码的能力,尤其是在写的过程中遇到了许多困难,在多次寻求同学的帮助下终于解决了。
还发现了自己的薄弱之处,就是在文件的处理时存在许多纰漏,导致文件读取不成功。
并且我还加深了对线性表的存在与空的区别。
还有对“&
”引用符号的理解,加强了其与“*”的区别,“&
e”使得在函数中调用主函数中的值“e”时可以同时更改其值,如在GetElem函数中调用了“e”的值然后在主函数中输出,如果要更改其值的话就必须要用“&
”符号。
2基于二叉链表的二叉树实现
2.1问题描述
采用二叉链表作为二叉树的物理结构,实现二叉树的基本运算,数据元素的类型名可自行定义。
要求构造一个具有菜单的功能演示系统,其中,在主程序中完成函数调用所需实参值的准备和函数执行结果的显示,并给出适当的操作提示。
2.1.1二叉树的基本概念
二叉树是一种树型结构,即n个结点的有限集,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。
2.1.2逻辑结构与基本运算
抽象数据类型二叉树的定义如下:
ADTBinaryTree{
数据对象D:
D是具有相同特性的数据元素的集