1、实验报告一顺序表完成人:朱 荣(程序员、测试员、文档员) 113200980300006 陈森来(程序员、测试员、文档员) 113200980300007 邓兵超(程序员、测试员、文档员) 113200980300023 熊 余(程序员、测试员、文档员) 113200980300030 实验题目实验一 线性结构(综合性实验 3学时)实验目的本次实习的主要目的在于熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉各种链表的操作为侧重点。通过本次实习还可复习高级语言的使用方法。必做题:1、顺序线性表的插入、删除、输出元素程序。算法设计思路插入算法:int Insert_SeqList(SeqL
2、ist *L,int i,DataType x) /顺序表的插入算法cout把元素x插入到位置i上SeqLength=MAXSIZE-1) /数组长度等于设定值-1,则表满cout表满endl;return -1;if(iL-SeqLength+1) /插入位置在第一个之前,或者插入到大于当前数组的长度+1cout位置错SeqLength-1;j=i;j-) /i之后全部后移L-dataj+1=L-dataj;L-datai=x; /将元素填充到空白位置L-SeqLength+;cout插入成功endl;Display_SeqList(L);return 1;.顺序表的删除算法:int Del
3、ete_SeqList(SeqList *L,int i) cout将位置为i的元素删除endl;int j;if(iL-SeqLength)cout不存在第i个元素endl;return 0;for(j=i;jSeqLength-1;j+)L-dataj=L-dataj+1; /i索引之后全部前移L-SeqLength-;cout删除成功endl;Display_SeqList(L);return 1;顺序表的输出算法:void Display_SeqList(SeqList *L) cout顺序表中储存的元素为endl;int i;for(i=0;iSeqLength-1;i+)coutd
4、atai ; coutendl;编写代码,调试运行【Sequence.h】#includeusing namespace std;#define MAXSIZE 15typedef int DataType;typedef struct DataType dataMAXSIZE; /通常用一位数组来描述顺序表的数据存储 int SeqLength; /*线性表长度*/ SeqList; SeqList *Init_SeqList(); /初始化顺序表void Define_SeqList(SeqList *L,int n); /填充顺序表的内容void Display_SeqList(SeqL
5、ist *L); /提取顺序表中的元素int Insert_SeqList(SeqList *L,int i,DataType x); /添加元素到指定位置(从开始)int Delete_SeqList(SeqList *L,int i); /删除指定位置的元素(从开始)【Sequence.cpp】#include Sequence.h#includeusing namespace std;SeqList *Init_SeqList()/顺序表的初始化算法,将顺序表清空SeqList *L;L=new SeqList;L-SeqLength=0; /*长度置为-1*/return L;/顺序表
6、的定义算法void Define_SeqList(SeqList *L,int n) cout请依次输入顺序表中要储存的元素:endl;for(int i=0;iL-datai; /输入数组元素L-SeqLength+;/顺序表的输出算法void Display_SeqList(SeqList *L) cout顺序表中储存的元素为endl;int i;for(i=0;iSeqLength-1;i+)coutdatai ; coutendl;/顺序表的插入算法int Insert_SeqList(SeqList *L,int i,DataType x) cout把元素x插入到位置i上SeqLen
7、gth=MAXSIZE-1) /数组长度等于设定值-1,则表满cout表满endl;return -1;if(iL-SeqLength+1) /插入位置在第一个之前,或者插入到大于当前数组的长度+1cout位置错endl;int Is,Id;cout请重新输入数据_:Is; cout请重新输入插入的位置_:Id;Insert_SeqList(L,Id,Is);/顺序表的插入for(j=L-SeqLength-1;j=i;j-) /i之后全部后移L-dataj+1=L-dataj;L-datai=x; /将元素填充到空白位置L-SeqLength+;cout插入成功endl;Display_Se
8、qList(L);return 1;/顺序表的删除算法int Delete_SeqList(SeqList *L,int i) cout将位置为i的元素删除endl;int j;if(iL-SeqLength)cout不存在第i个元素endl;int Dd; cout请重新输入要删除数据的位置_:Dd; Delete_SeqList(L,Dd);/顺序表的删除for(j=i;jSeqLength-1;j+)L-dataj=L-dataj+1; /i索引之后全部前移L-SeqLength-;cout删除成功endl;Display_SeqList(L);return 1;【Test_Sequen
9、ce.cpp】 #include Sequence.h#includeusing namespace std;int main() int Sl,Is,Id,Dd; SeqList *L;/顺序表的定义 L=Init_SeqList();/顺序表的初始化 cout请定义线性表的长度:Sl; Define_SeqList(L,Sl);/定义顺序表 Display_SeqList(L);/顺序表的输出 cout请输入插入线性表的数据:Is; cout请输入该数据插入线性表的位置:Id; Insert_SeqList(L,Id,Is);/顺序表的插入 cout请输入要删除数据的位置:Dd; Dele
10、te_SeqList(L,Dd);/顺序表的删除 return 0;运行结果:必做题:2、带头结点的单链表的插入、删除、输出元素程序。 写出算法设计思路。插入删除的位置,建立结点指针,移动指针到要插入删除的节点的前一节点,对其进行插入删除操作。最后顺序输出元素。一、编写代码,调试运行,实现题目要求2题(代码)#includeusing namespace std;typedef struct linklist int data; struct linklist *next;LinkList;/尾插入节点方式建链式线性表void CreateList(LinkList *&sl) LinkLis
11、t *s,*r; int i; int n; int listdata; sl=(LinkList *)malloc(sizeof(LinkList); r=sl; coutn; cout请输入节点(整形数):; for(i=0;ilistdata; s=(LinkList *)malloc(sizeof(LinkList); s-data=listdata; r-next=s; r=s; r-next=NULL;/求解线性表的长度int GetLength(LinkList *sl) int i=0; LinkList *p=sl-next; while(p!=NULL) i+; p=p-n
12、ext; return i;/删除元素,位置不合法返回0,合法且完成操作返回1int DeleElem(LinkList *&sl,int i) if(iGetLength(sl) return 0; LinkList *p,*q; int j=1; p=sl; while(jnext; j+; /p指向删除节点的前一个节点 q=p-next; p-next=q-next; free(q); return 1;/插入元素,位置不合法返回0,合法且完成操作返回1int InsElem(LinkList *&sl,int x,int i) if(iGetLength(sl)+1) return 0
13、; LinkList *p,*s; s=(LinkList *)malloc(sizeof(LinkList); s-data=x; s-next=NULL; int j=1; p=sl; while(jnext; j+; s-next=p-next; p-next=s; return 1; /输出线性表的元素void DispElem(LinkList *sl) LinkList *p=sl-next; while(p!=NULL) coutdatanext; coutendl;/mainint main() LinkList *sl; cout建链式表:endl; CreateList(s
14、l); cout链式表的元素如下:; DispElem(sl); cout插入一个元素:; coutendl; int x,i; coutx; couti; if(InsElem(sl,x,i) cout插入操作完成后链式表的元素如下:; coutendl; DispElem(sl); else coutERROR!endl; cout删除一个元素:; coutendl; int j; coutj; if(DeleElem(sl,j) cout删除操作完成后链式表的元素如下:endl; DispElem(sl); else coutERROR!endl; return 0;测试数据运行结果如下
15、:(插入位置删除位置均合法)运行结果(插入位置删除位置均不合法):选做题:问题描述 约瑟夫(Joeph)问题的一种描述是:编号为1,2,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。基本要求 利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。二、写出算法设计思路。建立不带头结点的循环单链表,其节点包含三个数据项:data(
16、密码),num(序号),next(指向下一结点的指针),依据m值移动指针到出列者,输出序号,取出密码,删除该节点节点,以密码作为下一次循环m值,循环上述过程,知道单链表为空的。三、编写代码,调试运行,实现题目要求选做题(代码)#includeusing namespace std;typedef struct linklist struct linklist *next; int num; int data;LinkList;/建不带头结点的循环链表void CreateList(LinkList *&sl,int n) LinkList *rear; LinkList *s; int lda
17、ta,i; if(n0) cinldata; sl=(LinkList *)malloc(sizeof(LinkList); /sl为第一个节点,采用尾插入式建立单链表 sl-data=ldata; sl-num=1; rear=sl; for(i=2;ildata; s-data=ldata; s-num=i; rear-next=s; rear=s; rear-next=sl; else sl=NULL;/删除节点LinkList *DeletElem(LinkList *&sl,int i) int j=1; LinkList *p,*q; p=sl; while(jnext; /指向删
18、除的节点 j+; coutnumnext; while(q-next-num!=p-num) q=q-next; /找到前驱节点 q-next=p-next; return p;int main() int n; coutn; coutn个人的密码分别为:; LinkList *sl; CreateList(sl,n); int m; coutm; coutn个人的出列顺序:; LinkList *p,*q; q=sl; for(int i=0;idata; q=p-next; free(p); coutendl; return 0;测试数据 m的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)运行结果m的初值为2;密码:2 5 3 6(正确的结果应为2 4 3 1)运行结果如下四、写出算法设计、编程和调试运行的体会。一般建立带头结点的循环单链表时操作插入删除等操作较为容易,但考虑到本题目描述与不带头结点的单链表相识,故选择用单链表。题目为简单的模拟题,熟悉对单链表插入等操作。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1