实验二 顺序表与链表_第1页
实验二 顺序表与链表_第2页
实验二 顺序表与链表_第3页
实验二 顺序表与链表_第4页
实验二 顺序表与链表_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据结构与算法实验指导V2017常熟理工学院数据结构与算法实验指导与报告书 _2017_学年 第_1_ 学期专 业: 物联网工程_ _学 号: _ _姓 名: _ _实验名称:顺序表与链表_实验地点:N6-210_ _指导教师:聂盼红_ _计算机科学与工程学院2017实验二 顺序表与链表【实验目的】1、掌握线性表中元素的前驱、后续的概念。2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。3、对线性表相应算法的时间复杂度进行分析。4、理解顺序表、链表数据结构的特点(优缺点)。【实验学时】4学时【实验预习】回答以下问题:1、顺序表的存储表示在顺序表中,任一数据元素的存放位置是从起始位置开

2、始、与该数据元素的位序成正比的对应存储位置,借助LOC(ai)=LOC(a1)+(i-1)*1 确定,则顺序表是一种随机存取的存储结构。2、单链表的存储表示线性链表也称单链表,在每一个结点中只包含一个指针,用于指示该结点的直接后继结点,整个链表通过指针相连,最后一个结点因为没有后继结点,其指针置为空(NULL)。这样,链表中所有数据元素(结点)构成一对一的逻辑关系,实现线性表的链式存储。【实验内容和要求】1、按照要求完成程序exp2_1.c,实现顺序表的相关操作。以下函数均具有返回值,若操作完成,返回OK,操作失败返回ERROR。函数需返回的其他数据,使用函数参数返回。exp2_1.

3、c部分代码如下:#include<stdio.h>#include<malloc.h>#define ERROR 0#define MAXSIZE 100#define OK 1typedef int ElemType; /*定义表元素的类型*/typedef struct slist ElemType *list; int listsize; int length;Sqlist;Sqlist *L;/*(1)-补充顺序表的存储分配表示,采用定长和可变长度存储均可*/*函数声明*/int InitList_sq(Sqlist *L);int CreateList_sq(

4、Sqlist *L);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->list=(ElemType *)malloc(MAXSIZE*sizeof(ElemType); if(L-&

5、gt;list=NULL) return ERROR; else L->length=0; L->listsize=MAXSIZE; return 0;/*InitList*/*(3)-创建具有n个元素的顺序表*/int CreateList_sq(Sqlist *L) int a,b,c; printf("请输入输入数据的个数n:"); scanf("%d",&a); printf("请输入输入的数据:"); for(b=0;b<a;b+) scanf("%d",&c); L-&

6、gt;listb=c; L->length=L->length+a; return 0;/*CreateList*/*(4)-输出顺序表中的元素*/int PrintList_sq(Sqlist *L) int a; printf("输出数据:"); for(a=0;a<L->length;a+) printf("%d ",L->lista); return 0;/*PrintList*/*(5)-在顺序表的第i个位置之前插入新元素e*/int ListInsert_sq(Sqlist *L,int i,ElemType e

7、) int a=L->length-1; for(;a>=i-1;a-) L->lista+1=L->lista; L->listi-1=e; L->length+=1; return OK;/*ListInsert*/*(6)-在顺序表中删除第i个元素,e返回删除的元素*/int ListDelete_sq(Sqlist *L,int i,ElemType *e) int a=i-1; *e=L->listi-1; for(;a<L->length;a+) L->lista=L->lista+1; L->length-=

8、1; return OK;/* ListDelete_sq */*(7)-在顺序表中查找指定值元素,pos为返回其位置序号*/int ListLocate(Sqlist *L,ElemType e,int *pos) int a,b=0; for(a=0;a<L->length;a+) if(e=L->lista) b=0; *pos=a+1; break; else b=1; if(b=1) return 0; else return OK;/* ListLocate */*定义菜单字符串数组*/int menu_select() char *menu="n*ME

9、NU*n", " 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;i<7;i+) /*输出主菜单数组

10、*/ printf("%s",menui); do printf("nEnter you choice(04):"); /*在菜单窗口外显示提示信息*/ scanf("%s",s); /*输入选择项*/ c=atoi(s); /*将输入的字符串转化为整形数*/ while (c<0|c>4); /*选择项不在04之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/*主函数*/int main() Sqlist sl; InitList_sq(&sl);int m,k; for (;)

11、/*无限循环*/ switch (menu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/ case 1: printf("n1-Create Sqlist:n"); CreateList_sq(&sl); printf("nPrint Sqlist:n"); PrintList_sq(&sl); break; case 2: printf("n3-GetElem from Sqlist:n"); printf("please input search data:"); sca

12、nf("%d",&k); int pos; if (!ListLocate(&sl,k,&pos) printf("Not found"); else printf("found the element, position is %dn",pos); printf("nPrint Sqlist:n"); PrintList_sq(&sl); break; case 3: printf("n4-Insert from Sqlist:n"); printf("

13、;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: printf("n5-Delete from Sqlist:

14、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("n

15、ERROR!"); break; case 0: exit(0); /*如菜单返回值为0程序结束*/ return 0;(1)创建一个顺序表(2)查找元素位置(3)插入元素(4)删除元素2、按照要求完成程序exp2_2.c,实现单链表的相关操作。exp2_2.c部分代码如下:#include<stdio.h>#include<malloc.h>#define ERROR 0#define OK 1typedef int ElemType; /*定义表元素的类型*/*(1)-线性表的单链表存储表示*/typedef struct LNode ElemType d

16、ate; struct LNode *next;LNode,*LinkList;LNode *InitList(); /*带头结点单链表初始化*/void PrintList(LinkList L); /*输出带头结点单链表的所有元素*/int 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位置的元素,并

17、由e返回其值*/void DestroyLinkList(LinkList L);/*释放链表及其空间*/LinkList CreateList(int n); /*创建n个结点的单链表*/int menu_select(); /*菜单函数*/*带头结点单链表初始化*/LNode *InitList()LinkList L; L=(LNode *)malloc(sizeof(LNode); /*申请一个头结点*/ if (!L) return ERROR; /*申请失败*/ L->next=NULL; /*头结点的指针域置空*/ return L;/*(1)-输出带头结点单链表的所有元素

18、*/void PrintList(LinkList L) LNode *p=L->next; int i=0; while(p) i+; printf("n第%d个元素%d",i,p->date); p=p->next; /*PrintList*/*(2)-在单链表的第i个位置插入元素e,若插入成功返回OK,插入失败返回ERROR*/int InsertElem(LinkList L,int i,ElemType e) LNode *p=L,*s; int j=0; while(p&&j<i-1) p=p->next; j+;

19、if(!p|j>i-1) return ERROR; s=(LNode *)malloc(sizeof(LNode); if(!s)return ERROR; s->date=e; s->next=p->next; p->next=s; return OK;/* InsertElem */*(3)-查找第i位置的元素,若存在返回OK并由e返回其值,若不存在返回ERROR*/int GetElem(LinkList L,int i,ElemType *e) LNode *p; int j=1; p=L->next; while(p&&j<

20、i) p=p->next; j+; if(!p|j>i) return ERROR; *e=p->date; 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&&j<i-1) p=p->next; j+; if(!p|j>i-1) return ERROR; s=p->nex

21、t; p->next=s->next; *e=s->date; free(s); return OK;/* DeleteElem */*(5)-创建具有n个结点的单链表,创建成功返回其头指针*/LinkList CreateList(int n) LNode *p,*q,*L; L=InitList(); p=L; int i=1; while(i<=n) q=(LNode *)malloc(sizeof(LNode); printf("输入链表的结点date %d: ",i+); scanf("%d",&q->da

22、te); q->next=NULL; p->next=q; p=q; return L;/*CreateList*/*释放链表及其空间*/void DestroyLinkList(LinkList L) LNode *p=L,*q; while(p) q=p->next; free(p); p=q; /* DestroyLinkList */int menu_select() char *menu="n*MENU*n", " 1. Init LinkListn", /*初始化链表*/ " 2. Get Elementn&quo

23、t;, /*查找元素*/ " 3. Insert datan", /*插入元素*/ " 4. Delete datan", /*删除元素*/ " 5. CreateLinkListn", /*创建具有n个元素的链表*/ " 0. Destroy LinkList&&Quitn", /*释放链表所占空间&退出*/ "n*MENU*n" ; char s3; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ for (i=0;i<8;i+) /*输出

24、主菜单数组*/ printf("%s",menui); do printf("nEnter you choice(05):"); /*在菜单窗口外显示提示信息*/ scanf("%s",s); /*输入选择项*/ c=atoi(s); /*将输入的字符串转化为整形数*/ while (c<0|c>5); /*选择项不在05之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/int main() int i,n; ElemType e; LinkList L=NULL; /*定义指向单链表的指针

25、*/ 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 2: printf("n2-GetElem fro

26、m 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 exists!"); break; case 3: printf("n3-Insert e int

27、o LinkList:n"); printf("input pos="); scanf("%d",&i); printf("input e="); scanf("%d",&e); if(L!=NULL&&InsertElem(L,i,e) printf("nInsert OK!n"); printf("nPrintfList:n"); PrintList(L); else printf("nInsert Error!n&qu

28、ot;); 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("nPrintfList:n"); PrintList(L); else prin

29、tf("nDelete Error!n"); break; case 5: printf("please input n:"); /*输入单链表的元素个数*/ scanf("%d",&n); if (n<0) printf("ERROR"); break; printf("nCreate LinkList.n"); L=CreateList(n); if (L=NULL) printf("Error!n"); break; printf("nPrint

30、fList:n"); PrintList(L); break; case 0: printf("nDestroy linklist and free memory .n"); if(L!=NULL) DestroyLinkList(L); L=NULL; exit(0); /*如菜单返回值为0程序结束*/ return 0;实验结果:(1)初始化链表:(2)查找元素:(3)插入数据:(4)删除数据:(5)创建链表:(6)销毁和退出链表:3循环链表的应用(约瑟夫回环问题、)用整数序列1,2,3,n表示顺序坐在圆桌周围的人,并采用循环链表作为存储结构。任意位置k开始计

31、数,计到m让此位置的人出局,重复上述过程,直至只剩下最后一个人。依次输出每个出局的人的序号。提示:用一个无头结点的循环单链表来实现n个元素的存储。exp2_3.c部分代码如下:#include<stdio.h>#include<malloc.h>#define ERROR 0#define OK 1typedef int ElemType; /*定义表元素的类型*/typedef struct LNode /*线性表的单链表存储*/ ElemType data; struct LNode *next; LNode,*LinkList;/*(1)-创建具有n个结点的无头结

32、点的单向循环链表,返回其头指针*/LinkList CreateList(int n) LinkList L; L=(LinkList )malloc(sizeof(LinkList); LNode *q,*p; printf("输入元素:n"); scanf("%d",&L->data); q=L; int a; for(a=0;a<n-1;a+) p=(LNode *)malloc(sizeof(LNode); scanf("%d",&p->data); q->next=p; q=p; q-

33、>next=L; return L;/*CreateList*/*(2)-输出无头结点循环单链表的所有元素*/void PrintList(LinkList L) printf("输出表中的元素:"); LNode *p; printf("%dn",L->data); p=L->next; while(p!=L) printf("n%dn",p->data); p=p->next; /*PrintList*/*(3)-约瑟夫问题计算,依次输出出局的元素的序号*/void JOSEPHUS(int n,in

34、t k,int m,LinkList L) L=CreateList(n); PrintList(L); int a,length=n; LNode *q; for(a=1;a<k-1;a+) L=L->next; while(length!=1) for(a=0;a<m-1;a+) L=L->next; q=L->next; L->next=q->next; printf("被删除的数字:%dn",q->data); free(q); length-=1; printf("输出最终的一个数字:%d",L-

35、>data);/*JOSEPHUS*/int main() int n,m,k; LinkList L=NULL; /*定义指向单链表的指针*/ printf("1.输入元素的个数"); printf(" 2.输入位置"); printf(" 3.输入人数"); while(scanf("%d%d%d",&n,&k,&m)=3) /*n个元素从k位置开始每m个报数*/ JOSEPHUS(n,k,m,L); return 0;.输入10 2 3,表示一共有10个数,从第2个数之后开始数,

36、数到3的人出局实验结果: 4、选做实验:设有头单链表,设计算法将表中值相同的元素仅保留一个结点。提示:指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;指针p继续指向下一个元素,开始下一轮的删除,直至pnull为至,既完成了对整个链表元素的删除相同值。#include<malloc.h>#include<stdio.h>#define ERROR 0#define OK 1typedef int ElemType;typedef struct LNode ElemType data; struct LNode *next;L

37、Node,*LinkList;LinkList L=NULL;LNode *InitList(LinkList L);void PrintList(LinkList L);void DestroyLinkList(LinkList L);LinkList CreateList(int n);/*带头结点单链表初始化*/LNode *InitList(LinkList L) L=(LNode *)malloc(sizeof(LNode); if (!L) return ERROR; L->next=NULL; return L;/*输出带头结点单链表的所有元素*/void PrintList(LinkList L) LinkList p; p=L->next; int i=1; while(p) printf("nthe %d data is %d",i+,p->data); p=p->next; printf("

温馨提示

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

评论

0/150

提交评论