实验报告实验类型__综合设计__实验室_软件实验室三__一、实验题目线性表的基本操作二、实验目的和要求1)掌握线性表的特点2)掌握线性表的顺序存储结构和链式存储结构的基本运算及应用。
3)尽可能考虑算法的健壮性4)实验报告中要写出测试数据、错误分析以及收获。
三、需求分析本演示程序用c++6.0编写,完成单链表和顺序表的生成,任意位置的插入、删除,以及确定某一元素在单链表中的位置。
1、输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。
在所有输入中,元素的值都是整数2、输出的形式:在所有三种操作中都显示操作是否正确以及操作后单链表的内容。
其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置3、程序所能达到的功能:完成能完成两种存储结构的基本运算以及二级菜单的运用4、测试数据1)输入2,建立一个链表2)插入操作中依次输入11,22,33,44,55,生成一个单链表3)查找操作中依次输入22,44,返回这,2个元素在单链表中的位置4)删除操作中依次输入3,删除位于3的元素5)输入1,建立一个顺序表,再做类似上述数据测试四、概要设计为了实现上述程序功能,需要定义1、单链表的抽象类型如下:ADT LinkList {数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}数据关系:R={<ai,ai+1>|ai,ai+1 ∈D}基本操作:CreateList_L1(&L)操作结果:构造一个空的单链表L.ListInsert_L1(&L,i,e)初始条件:单链表L已存在操作结果:将元素e插入到单链表L的第i位置前ListInsert_L2(&L,i,e)初始条件:单链表L已存在操作结果:将元素e插入到单链表L的第i位置后ListDelte_L(&L,i)初始条件:单链表L已存在操作结果:将单链表L中i位置的元素删除GetElem_L(L,i)初始条件:单链表L依存在操作结果:单链表L中查找第i个元素并返回其元素length_l(&L)初始条件:单链表L已存在操作结果:将单链表L的长度值返回}2、顺序表的抽象数据类型ADT list {数据对象:D={ai|ai∈Elem Set,i=0,1,2,…,n,n≥0}数据关系:R={<ai,ai+1>|ai,ai+1 ∈D}基本操作:Initlist_Sq (&L)操作结果:构造一个空的顺序表L.ListInsert_Sq (&L,i,e)初始条件:顺序表L已存在操作结果:将元素e插入到顺序表L的第i位置ListDelete_Sq (&L,i,&e)初始条件:顺序表L已存在操作结果:将顺序表L中i位置的元素删除,元素值置入e中返回 locate_Sq (L,e)初始条件:顺序表L依存在操作结果:顺序表L中查找元素e并返回其位置}3、本程序包含三个模块1)主程序模块:协调各函数的调用,实现所要求的功能;2)顺序表模块:实现线性表顺序存储后的基本操作;3)单链表模块:实现线性表链式存储后的基本操作。
4、各模块之间的调用关系如下:主程序模块顺序表模块单链表模块五、详细设计1、顺序表的元素类型typedef struct{int *elem;int length;int listsize;}SqList;2、顺序表的基本操作int Initlist_Sq(SqList *L)//构造一个新的线性表//如果没有开辟成功返回错误void ListInsert_Sq(SqList *L,int i,int e)//在第i个位置插入元素evoid listshow_Sq(SqList *L)//输出顺序表元素int locate_Sq(SqList *L,int e)//查找元素e,并返回其位置int ListDelete_Sq(SqList *L,int i,int *e)//删除第i个位置上的元素,并返回其元素其中部分操作的伪码算法如下:int ListDelete_Sq(SqList *L,int i,int *e)//删除第i个位置上的元素,并返回其元素{int j;if((i<1)||(i>L->length))return ERROR;*e=L->elem[i-1];j=i-1;while(j<L->length){L->elem[j]=L->elem[j+1];j++;}L->length--;}3、单链表的元素类型,结点类型和指针类型typedef struct LNode{int date;struct LNode *next;}LNode,*LinkList;4、单链表的基本操作void CreateList_L1(LNode *l)//初始化链表int ListInsert_L1(LNode *l,int i,int e)//第i个位置前插入int ListInsert_L2(LNode *l,int i,int e)//第i个位置后插入int GetElem_L(LNode *l,int i)//访问第i个元素int ListDelte_L(LinkList l,int i)//删除第i个元素int length_l(LNode *l)//求链表的长度void show_l(LNode *l)//输出链表其中部分操作的伪码算法如下:int GetElem_L(LNode *l,int i)//访问第i个元素{LNode *p;int j;p=l->next;j=1;while(p&&j<i){p=p->next;++j;}if(!p||j>i)return ERROR;elsereturn p->date;}int ListInsert_L2(LNode *l,int i,int e)//第i个位置后插入{LNode *p;LNode *s;int j;p=l;j=0;while(p&&j<i){p=p->next;++j;}if(!p||j>i)return ERROR;s=(LNode *)malloc(sizeof(LNode));s->date=e;s->next=p->next;p->next=s;}5、函数的调用关系图反映了演示程序的层次结构:ListInsert_Sq locate_Sq ListDelete_Sq六、调试分析1、刚开始是混淆了c语言和c++语言的不同,从而忽略了&的用法,致使编写时费了许多时间去纠正错误;2、本程序的模块划分简单而合理,在操作方面比较容易,能很快了解线性表的顺序存储和链式存储结构下的基本运算;3、本实验程序设计中,将程序分为三个模块,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可重用性,确实得到了一次良好的程序设计训练。
七、使用说明请输入迷宫的行数,列数:6 6请输入迷宫内墙单元数:2请依次输入迷宫内墙每个单元的行数,列数:3 44 5迷宫结构如下:0 0 0 0 00 1 0 1 00 1 1 1 00 1 0 1 00 0 0 0 0请输入起点的行数,列数:(空格隔开)1 1请输入终点的行数,列数:(空格隔开)3 3此迷宫从入口到出口的一条路径如下:0 0 0 0 00 1 0 1 00 2 3 4 00 1 0 5 00 0 0 0 0请按任意键继续. . .八、测试结果主菜单选择1进入顺序表菜单选择1,输入2,输入12 23,输出12、23,选择2,输入22,输入1,输出22、12、23,选择3,输入1,输出所删除的元素是22,输出12、23,选择4,输入12,输出元素位置在1,最后选择0,退回主菜单,然后选择2链表菜单选择1后选择1输入所要建立的链表的节点数为2,输入元素12 34,输出34、12再选择2,输入1,输出34.再选择3后选择1,输入插入位置1,元素33,输出33、34、12,然后选择4,输入所要删除的位置2,输出所要删除的元素是34,并输出33、12,然后选择5,输出链表的长度是2,最后选择0,在选择0,运行结束九、实验总结通过对实验的认真处理以及认真对待,对线性表的相关性质得到了充分的认识,对算法与程序的转变有了一定的了解,为以后做了一定的基础,掌握了线性表的两种存储结构—链式存储和顺序存储,掌握了线性表的建立、插入、删除和访问,再对链表初始化时注意不能传空地址,否则会引发动态分配空间错误的。
注:模块分工****(学号)顺序表的建立、插入和输出****()顺序表的删除、查询和链表的输出****()单链表的前插建立、后插建立和删除****()单链表的前插新元素、后插新元素和查询****()负责链表的求线性表的表长、main函数的建立和页面的设计。