当前位置:文档之家› 数据结构课程实验报告(15)

数据结构课程实验报告(15)

课程实验报告课程名称:数据结构专业班级:信安1302学号:姓名:指导教师:报告日期:2015. 5. 12计算机科学与技术学院目录1 课程实验概述............ 错误!未定义书签。

2 实验一基于顺序结构的线性表实现2.1 问题描述 ...................................................... 错误!未定义书签。

2.2 系统设计 ...................................................... 错误!未定义书签。

2.3 系统实现 ...................................................... 错误!未定义书签。

2.4 效率分析 ...................................................... 错误!未定义书签。

3 实验二基于链式结构的线性表实现3.1 问题描述 ...................................................... 错误!未定义书签。

3.2 系统设计 ...................................................... 错误!未定义书签。

3.3 系统实现 ...................................................... 错误!未定义书签。

3.4 效率分析 ...................................................... 错误!未定义书签。

4 实验三基于二叉链表的二叉树实现4.1 问题描述 ...................................................... 错误!未定义书签。

4.2 系统设计 ...................................................... 错误!未定义书签。

4.3 系统实现 ...................................................... 错误!未定义书签。

4.4 效率分析 ...................................................... 错误!未定义书签。

5 实验总结与评价 ........... 错误!未定义书签。

1 课程实验概述这门课是为了让学生了解和熟练应用C语言进行编程和对数据结构进一步深入了解的延续。

首先,课程实验是培养为了我们学生的动手能力而开设的,我们都知道的是实验是最能检验一个学会还是没有学会知识的一种最为有效地方式。

关于本次实验的所需要的知识,就是所学的C语言的知识,特别是C语言的实际操作的能力。

本次实验以数据链表的各种操作为基础,考察我们的综合应用的能力,是对我们以前学习的一次很好的检测。

还有就是根据数据结构这门课程的性质和它的教学的人物要求,让学生学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构储存结构及其相应的算法,并初步掌握算法的时间分析和空间分析。

而与数据结构相配套的这三次的实验恰恰是为了让我们学生用实际的操作来验证树上所学到的数据结构的相应的方法。

2 实验一基于顺序结构的线性表实现2.1 问题描述基于顺序存储结构,实现线性表的基本的、常见的运算,用线性和链性的方式对数据进行各种必要的操作。

2.2 系统设计,分别是:printf(" Menu for Linear Table On Sequence Structure \n");printf("------------------------------------------------------\n");printf(" 1. IntiaList 7. LocateElem\n");printf(" 2. DestroyList 8. PriorElem\n");printf(" 3. ClearList 9. NextElem \n");printf(" 4. ListEmpty 10. ListInsert\n");printf(" 5. ListLength 11. ListDelete\n");printf(" 6. GetElem 12. ListTrabverse\n");printf(" 0. Exit\n");printf("------------------------------------------------------\n");printf(" 请选择你的操作[0~12]:");,数据元素为包含一个整型变量的结构体:typedef struct{int item;}Elemtype;,用于存储该表的基本信息和首结点地址:typedef struct{Elemtype * elem;int length,status,Increment;int listsize;}SqList;int main(){SqList L;#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 102.3 系统实现1.3.1 IntiaList 功能初始化线性表,传入的是头结点地址。

申请一个大小为LIST_INT_SIZE 、类型为Elemtype 的线性存储空间,并用头结点中的首结点指针指向该空间首地址1.3.2 DestroyList 功能销毁头结点中首结点址针指向的线性存储空间,传入的是头结点地址。

1.3.3 ClearList 功能与Destroy 类似但是又有不同,ClearList 并不销毁物理空间,而是修改逻辑关系值:1.3.4 ListEmpty 功能判空功能,判断表是否为空表。

传入的是头结点值,而非地址,因为不需要对头结点进行修改。

1.3.5 ListLength 功能求表长的长度的功能,由于创建过程中已经把表长信息包含在头结点中,所以直接调用并显示即可:1.3.6 GetElem 功能获取第i 号元素,传入的是头结点值、元素编号i 、以及出口表结点地址。

1.3.7 LocatElem 功能获取指定元素编号,传入头结点值、存储了所需元素信息的一个临时表结点值compare 函数地址。

采用顺序比较法从表头遍历并比较,一旦找到,返回编号i 。

时间复杂度为n /2/)1(n n ,O(n)。

1.3.8 PriorElem 功能求指定元素的前一个元素的内容,传入头结点值、包含指定元素信息的一个临时表结点值、存储前一个元素的表结点地址。

主要思路是先调用LocatElem 确定指定元素的位置,如果不是首结点则可直接取到PriorElem 的地址。

时间复杂度为O(n)。

1.3.9 NextElem 功能与PriorElem 功能类似,求指定元素的后一个元素的内容,传入头结点值、包含指定元素信息的一个临时表结点值、存储前一个元素的表结点地址。

主要思路是先调用LocatElem 确定指定元素的位置,如果不是尾接点则可直接取到NextElem 的地址。

时间复杂度为O(n)。

ListInsertt 功能插入一个数据元素,传入头结点地址、插入位置i 、临时表结点值。

在调用插入函数前构造一个临时表结点,用于存储数据元素信息。

进入插入子函数,插入前先判断插入位置是否合理,再判断是否“满载”。

如果满载则重新申请更大的存储空间。

接下来正式插入数据元素,“先空位置再插入”。

平均时间复杂度为n/2/)1(nn,O(n),n即listlength。

ListDelete功能删除指定编号的数据元素,传入头结点地址、编号i、表结点类型结构体地址来返回被删除元素内容。

执行前先判断传入的编号是否在可寻找范围内。

执行删除操作之后,进行“移位”运算。

时间复杂度仍为O(n)。

ListTraverse功能顺序遍历顺序表元素,传入头结点值、visit函数地址。

时间复杂度为O(n) compare与visit函数status compare(Elemtype c1,Elemtype c2) /* c1等于c2 */{if(c1.item==c2.item)return TRUE;elsereturn FALSE;}status visit(Elemtype e){printf(" %d", e);return TRUE;}1.4效率分析在上面介绍各功能时已经提到时间复杂度的计算了,这里再简单分析一下。

具有同数量级复杂度的功能在实现方法上一般近似。

而LocatElem、PriorElem、NextElem是基于LocatElem,平均效率为O(n);由于在头结点结构体中已经包含了ListEmpty、ListLength所需信息,所以效率为O(1);ListInsert、ListDelete都要对顺序表进行“移位”运算,平均效率为O(n)。

3 实验二基于链式结构的线性表实现2.1问题描述基于链式存储结构,实现线性表的基本的、常见的运算。

2.2系统设计,数据元素包含一个整型变量以及自身类型的指针typedef struct LNode{ElemType data;struct LNode *next;}LNode,* LinkList;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASTABLE -1#define OVERFLOW -22.3系统实现2.3.1 IntiaList由于链表的创建是动态的,因此初始化不需要创建一个巨大的存储空间,这样可以节约很多内存空间。

2.3.2 DestroyList需要遍历链表,同时释放掉每个元素。

2.3.3 ClearList由于链表不同于数序表,这里不仅要在逻辑上清空,还要在物理结构上清空,实现上与Destroy类似,即在改变相应的对应的关系后还要销毁相应的元素。

2.3.4 ListEmpty判空操作,L.elem不为NULL即不空。

相关主题