数据结构实验报告顺序表与链表

上传人:无*** 文档编号:105954097 上传时间:2022-06-13 格式:DOC 页数:17 大小:59KB
收藏 版权申诉 举报 下载
数据结构实验报告顺序表与链表_第1页
第1页 / 共17页
数据结构实验报告顺序表与链表_第2页
第2页 / 共17页
数据结构实验报告顺序表与链表_第3页
第3页 / 共17页
资源描述:

《数据结构实验报告顺序表与链表》由会员分享,可在线阅读,更多相关《数据结构实验报告顺序表与链表(17页珍藏版)》请在装配图网上搜索。

1、-实验二 顺序表与链表【实验目的】1、掌握线性表中元素的前驱、后续的概念。2、掌握顺序表与链表的建立、插入元素、删除表中*元素的算法。3、对线性表相应算法的时间复杂度进展分析。4、理解顺序表、链表数据构造的特点优缺点。【实验学时】4学时【实验预习】答复以下问题:1、顺序表的存储表示假设线性表中每一个数据元素的存储空间大小为1个字节,并且以其所占存储空间的第一个字节的地址作为该元素的存储位置,则线性表中任一个数据元素的存储位置为:LOC(Ai)=LOC(A1)+(i-1)*1其中,LOC(A1)为线性表中第一个数据元素a1的存储位置,也称为线性表的起始位置首地址。typedef struct S

2、qlist ElemType *slist;/存储空间的基地址 int length;/表长度 int listsize;/当前分配的存储空间容量Sqlist;2、单链表的存储表示线性链表也称单链表,在每一个结点中只包含一个指针,用于指示该结点的直接后继结点,整个链表通过指针相连,最后一个结点因为没有后继结点,其指针置为空NULL。这样,链表中所有数据元素结点构成一对一的逻辑关系,实现线性表的链式存储。【实验容和要求】1、按照要求完成程序e*p2_1.c,实现顺序表的相关操作。以下函数均具有返回值,假设操作完成,返回OK,操作失败返回ERROR。函数需返回的其他数据,使用函数参数返回。e*p2

3、_1.c局部代码如下:*include*include*define ERROR 0*define OK 1*define INIT_SIZE 100*define INCREM 10typedef int ElemType; /*定义表元素的类型*/*1-补充顺序表的存储分配表示,采用定长和可变长度存储均可*/typedef struct Sqlist ElemType *slist;/基地址 int length;/表长度 int listsize;/分配的空间Sqlist;/*函数声明*/int InitList_sq(Sqlist *L);int CreateList_sq(Sqlis

4、t *L,int n);int ListInsert_sq(Sqlist *L,int i,ElemType e);int PrintList_sq(Sqlist *L);int ListDelete_sq(Sqlist *L,int i,ElemType *e);int ListLocate(Sqlist *L,ElemType e,int *pos);int menu_select();/*2-顺序表的初始化*/int InitList_sq(Sqlist *L) L-slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType); if(!L-sli

5、st) return ERROR; L-length=0; L-listsize=INIT_SIZE;/初始空间容量 return OK;/*InitList*/*3-创立具有n个元素的顺序表*/int CreateList_sq(Sqlist *L,int n) ElemType e; int i; for(i=0;in;i+) printf(input data %d:,i+1); scanf(%d,&e); if(!ListInsert_sq(L,i+1,e) return ERROR; return OK;/*CreateList*/*4-输出顺序表中的元素*/int PrintLis

6、t_sq(Sqlist *L) int i; for(i=1;ilength;i+) printf(%5d,L-slisti-1); return OK;/*PrintList*/*5-在顺序表的第i个位置之前插入新元素e*/int ListInsert_sq(Sqlist *L,int i,ElemType e) int k; if(iL-length+1) return ERROR; if(L-length=L-listsize)/当前空间已满,申请新的空间 L-slist=(ElemType *)realloc(L-slist,(L-listsize+INCREM)*sizeof(Ele

7、mType); if(!L-slist) return ERROR; L-listsize+=INCREM; for(k=L-length-1;k=i-1;k-) L-slistk+1=L-slistk; L-slisti-1=e; L-length+; return OK;/*ListInsert*/*6-在顺序表中删除第i个元素,e返回删除的元素*/int ListDelete_sq(Sqlist *L,int i,ElemType *e) int j;if(iL-length) return ERROR; *e=L-slisti-1; for(j=i;ilength;j+) L-slis

8、tj-1=L-slistj; L-length-; return OK;/* ListDelete_sq */*7-在顺序表中查找指定值元素,pos为返回其位置序号*/int ListLocate(Sqlist *L,ElemType e,int *pos) ElemType *end=L-slist+L-length; ElemType *p=L-slist; int i; for(i=1;p=end) return ERROR; else return OK; /* ListLocate */*定义菜单字符串数组*/int menu_select() char *menu=n*MENU*n

9、, 1. Create Listn, /*创立顺序表*/ 2. Get Elementn, /*查找顺序表中的元素*/ 3. Insert datan, /*插入数据*/ 4. Delete datan, /*删除数据*/ 0. Quitn, /*退出*/ n*MENU*n ; char s3; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ for (i=0;i7;i+) /*输出主菜单数组*/ printf(%s,menui); do printf(nEnter you choice(04):); /*在菜单窗口外显示提示信息*/ scanf(%s,s); /*输入选

10、择项*/ c=atoi(s); /*将输入的字符串转化为整形数*/ while (c4); /*选择项不在04之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/*主函数*/int main() Sqlist sl; InitList_sq(&sl);int n;int m,k; printf(please input n:); /*输入顺序表的元素个数*/ scanf(%d,&n); if(n=0)printf(ERROR); for (;) /*无限循环*/ switch (menu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/ cas

11、e 1: printf(n1-Create Sqlist:n); CreateList_sq(&sl,n); printf(nPrint Sqlist:n); PrintList_sq(&sl); break; case 2: printf(n3-GetElem from Sqlist:n); printf(please input search data:); scanf(%d,&k); int pos; if (!ListLocate(&sl,k,&pos) printf(Not found); else printf(found the element, position is %dn,

12、pos); printf(nPrint Sqlist:n); PrintList_sq(&sl); break; case 3: printf(n4-Insert from Sqlist:n); printf(n input insert location and data:(location,data)n); scanf(%d,%d,&m,&k); if (ListInsert_sq(&sl,m,k) printf(nOKn); printf(nPrint Sqlist:n); PrintList_sq(&sl); else printf(nERROR!); break; case 4: p

13、rintf(n5-Delete from Sqlist:n); printf(nplease input delete locationn); scanf(%d,&k); int deldata; if (ListDelete_sq(&sl,k,&deldata) printf(nOKn); printf(nDelete data is %dn,deldata); printf(nPrintSqlist:n); PrintList_sq(&sl); else printf(nERROR!); break; case 0: e*it(0); /*如菜单返回值为0程序完毕*/ return 0;2

14、、按照要求完成程序e*p2_2.c,实现单链表的相关操作。e*p2_2.c局部代码如下:*include*include*define ERROR 0*define OK 1typedef int ElemType; /*定义表元素的类型*/*1-线性表的单链表存储表示*/typedef struct LNode ElemType data; struct LNode *ne*t;LNode,*LinkList;LNode *InitList(LinkList L); /*带头结点单链表初始化*/void PrintList(LinkList L); /*输出带头结点单链表的所有元素*/int

15、 GetElem(LinkList L,int i,ElemType *e); /*查找第i位置的元素,并由e返回其值*/int InsertElem(LinkList L,int i,ElemType e);/*在第i个位置插入元素e*/int DeleteElem(LinkList L,int i,ElemType *e);/*删除第i位置的元素,并由e返回其值*/void DestroyLinkList(LinkList L);/*释放链表及其空间*/LinkList CreateList(int n); /*创立n个结点的单链表*/int menu_select(); /*菜单函数*/

16、*带头结点单链表初始化*/LNode *InitList(LinkList L) L=(LNode *)malloc(sizeof(LNode); /*申请一个头结点*/ if (!L) return ERROR; /*申请失败*/ L-ne*t=NULL; /*头结点的指针域置空*/ return L;/*1-输出带头结点单链表的所有元素*/void PrintList(LinkList L) LNode *p; p=L-ne*t; while(p!=NULL) printf(%5d,p-data); p=p-ne*t; /*PrintList*/*2-在单链表的第i个位置插入元素e,假设插

17、入成功返回OK,插入失败返回ERROR*/int InsertElem(LinkList L,int i,ElemType e) LNode *p=L,*s; int j=0; while(p&jne*t; j+; if(!p|ji-1) return ERROR; s=(LNode*)malloc(sizeof(LNode); if(!s) return ERROR; s-data=e; s-ne*t=p-ne*t; p-ne*t=s; return OK;/* InsertElem */*3-查找第i位置的元素,假设存在返回OK并由e返回其值,假设不存在返回ERROR*/int GetEl

18、em(LinkList L,int i,ElemType *e) LNode *p; int j=1; while(p&jne*t; j+; if(!p|ji) return ERROR; *e=p-data; return OK;/*GetElem*/*4-删除第i位置的元素,成功返回OK,并由e返回其值,假设不成功返回ERROR,注意删除的结点必须释放其所占空间*/int DeleteElem(LinkList L,int i,ElemType *e) LNode *p=L,*s; int j=0; while(p&jne*t; j+; if(!p|ji-1) return ERROR;

19、s=p-ne*t; p-ne*t=s-ne*t; *e=s-data; free(s); return OK;/* DeleteElem */*5-创立具有n个结点的单链表,创立成功返回其头指针*/LinkList CreateList(int n) LNode *p,*q,*head; int i; head=(LinkList)malloc(sizeof(LNode); head-ne*t=NULL; p=head; for(i=0;idata); q-ne*t=NULL;/节点指针域置空 p-ne*t=q;/新节点连接在表末尾 p=q; return head;/*CreateList*

20、/*释放链表及其空间*/void DestroyLinkList(LinkList L) LNode *p=L,*q; while(p) q=p-ne*t; free(p); p=q; /* DestroyLinkList */int menu_select() char *menu=n*MENU*n, 1. Init LinkListn, /*初始化链表*/ 2. Get Elementn, /*查找元素*/ 3. Insert datan, /*插入元素*/ 4. Delete datan, /*删除元素*/ 5. CreateLinkListn, /*创立具有n个元素的链表*/ 0. D

21、estroy LinkList&Quitn, /*释放链表所占空间&退出*/ n*MENU*n ; char s3; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ for (i=0;i8;i+) /*输出主菜单数组*/ printf(%s,menui); do printf(nEnter you choice(05):); /*在菜单窗口外显示提示信息*/ scanf(%s,s); /*输入选择项*/ c=atoi(s); /*将输入的字符串转化为整形数*/ while (c5); /*选择项不在05之间重输*/ return c; /*返回选择项,主程序根据该数调用相

22、应的函数*/int main() int i,n; ElemType e; LinkList L=NULL; /*定义指向单链表的指针*/ for (;) /*无限循环*/ switch (menu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/ /*值不同,执行的函数不同,break 不能省略*/ case 1: printf(n1-Init LinkList:n); L=InitList(L); if(L!=NULL) printf(nInitLinkList OK!n); else printf(nInitLinkList Error!n); break; case

23、 2: printf(n2-GetElem from LinkList:n); printf(input pos=); scanf(%d,&i); if (L!=NULL&GetElem(L,i,&e) printf(No%i is %d,i,e); printf(nPrintfList:n); PrintList(L); else printf(Error&Not e*ists!); break; case 3: printf(n3-Insert e into LinkList:n); printf(input pos=); scanf(%d,&i); printf(input e=); s

24、canf(%d,&e); if(L!=NULL&InsertElem(L,i,e) printf(nInsert OK!n); printf(nPrintfList:n); PrintList(L); else printf(nInsert Error!n); break; case 4: printf(n4-Delete from LinkList:n); printf(input pos=); scanf(%d,&i); if(L!=NULL&DeleteElem(L,i,&e) printf(nOKn); printf(nDelete data is %dn,e); printf(nPr

25、intfList:n); PrintList(L); else printf(nDelete Error!n); break; case 5: printf(please input n:); /*输入单链表的元素个数*/ scanf(%d,&n); if (n0) printf(ERROR); break; printf(nCreate LinkList.n); L=CreateList(n); if (L=NULL) printf(Error!n); break; printf(nPrintfList:n); PrintList(L); break; case 0: printf(nDes

26、troy linklist and free memory .n); if(L!=NULL) DestroyLinkList(L); L=NULL; e*it(0); /*如菜单返回值为0程序完毕*/ return 0;3、循环链表的应用约瑟夫回环问题用整数序列1,2,3,n表示顺序坐在圆桌周围的人,并采用循环链表作为存储构造。任意位置k开场计数,计到m让此位置的人出局,重复上述过程,直至只剩下最后一个人。依次输出每个出局的人的序号。提示:用一个无头结点的循环单链表来实现n个元素的存储。e*p2_3.c局部代码如下:*include*include*define ERROR 0*define

27、OK 1typedef int ElemType; /*定义表元素的类型*/typedef struct LNode /*线性表的单链表存储*/ ElemType data; struct LNode *ne*t; LNode,*LinkList;/*1-创立具有n个结点的无头结点的单向循环链表,返回其头指针*/LinkList CreateList(int n) LinkList head=NULL; LNode *s,*r; int i; for(i=1;idata=i; s-ne*t=NULL; if(head=NULL) head=s; else r-ne*t=s; r=s; r-ne

28、*t=head; return head;/*CreateList*/*2-输出无头结点循环单链表的所有元素*/void PrintList(LinkList L) LNode *p,*q; /p=L-ne*t; p=L; q=p; while(p!=NULL) printf(%5d,p-data); p=p-ne*t; if(p=q) break; printf(n);/*PrintList*/*3-约瑟夫问题计算,依次输出出局的元素的序号*/void JOSEPHUS(int n,int k,int m,LinkList L) LNode *p,*q; int i; p=L; for(i=

29、1;ine*t; while(p-ne*t!=p) for(i=1;ine*t; q-ne*t=p-ne*t; printf(%5d,p-data); free(p); p=q-ne*t; printf(%5d,p-data);/*JOSEPHUS*/int main() int n,m,k; LinkList L=NULL;/*定义指向单链表的指针*/ /输入n个人、从k位置开场、报m出局 while(scanf(%d%d%d,&n,&k,&m)=3) /*n个元素从k位置开场每m个报数*/ L=CreateList(n); PrintList(L); JOSEPHUS(n,k,m,L);

30、return 0;4、选做实验:设有头单链表,设计算法将表中值一样的元素仅保存一个结点。提示:指针p从链表的第一个元素开场,利用指针q从指针p位置开场向后搜索整个链表,删除与之值一样的元素;指针p继续指向下一个元素,开场下一轮的删除,直至pnull为至,既完成了对整个链表元素的删除一样值。*include*include*define ERROR 0*define OK 1typedef int ElemType; /*定义表元素的类型*/*1-线性表的单链表存储表示*/typedef struct LNode ElemType data; struct LNode *ne*t;LNode,*

31、LinkList;LinkList L=NULL;LNode *InitList(LinkList L); /*带头结点单链表初始化*/void PrintList(LinkList L); /*输出带头结点单链表的所有元素*/void DestroyLinkList(LinkList L);/*释放链表及其空间*/LinkList CreateList(int n); /*创立n个结点的单链表*/*带头结点单链表初始化*/LNode *InitList(LinkList L) L=(LNode *)malloc(sizeof(LNode); /*申请一个头结点*/ if (!L) retur

32、n ERROR; /*申请失败*/ L-ne*t=NULL; /*头结点的指针域置空*/ return L;/*1-输出带头结点单链表的所有元素*/void PrintList(LinkList L) LNode *p; p=L-ne*t; while(p!=NULL) printf(%5d,p-data); p=p-ne*t; printf(n);/*PrintList*/LinkList CreateList(int n) LNode *p,*q,*head; int i; head=(LinkList)malloc(sizeof(LNode); head-ne*t=NULL; p=hea

33、d; for(i=0;idata); q-ne*t=NULL;/节点指针域置空 p-ne*t=q;/新节点连接在表末尾 p=q; return head;/*CreateList*/LinkList SelectList(LinkList L) void Delete(LinkList L,int i); LNode *p,*q,*a; p=L-ne*t; a=L-ne*t; while(p!=NULL) q=p-ne*t; while(q!=NULL) if(p-data=q-data) a-ne*t = q-ne*t; a=q; q=q-ne*t; p=p-ne*t; return L;v

34、oid DestroyLinkList(LinkList L) LNode *p=L,*q; while(p) q=p-ne*t; free(p); p=q; /* DestroyLinkList */int main() int n; L=InitList(L); if(L=NULL) printf(nInitLinkList Error!n); return 0; printf(please input n:); /*输入单链表的元素个数*/ scanf(%d,&n); if(n=0) printf(nError!n); return 0; L=CreateList(n); if(L=NULL) printf(nInitLinkList Error!n); return 0; PrintList(L); L=SelectList(L); PrintList(L); if(L!=NULL) DestroyLinkList(L); L=NULL; return 0;【实验小结】. z.

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!