收藏 分享(赏)

实验二 顺序表与链表.doc

上传人:精品资料 文档编号:10008160 上传时间:2019-09-27 格式:DOC 页数:23 大小:387.50KB
下载 相关 举报
实验二   顺序表与链表.doc_第1页
第1页 / 共23页
实验二   顺序表与链表.doc_第2页
第2页 / 共23页
实验二   顺序表与链表.doc_第3页
第3页 / 共23页
实验二   顺序表与链表.doc_第4页
第4页 / 共23页
实验二   顺序表与链表.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

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

2、缺点) 。【实验学时】4 学时【实验预习】回答以下问题:1、顺序表的存储表示在顺序表中,任一数据元素的存放位置是从起始位置开始、与该数据元素的位序成正比的对应存储位置,借助 LOC(ai)=LOC(a1)+(i-1)*1 确定,则顺序表是一种随机存取的存储结构。2、单链表的存储表示线性链表也称单链表,在每一个结点中只包含一个指针,用于指示该结点的直接后继结点,整个链表通过指针相连,最后一个结点因为没有后继结点,其指针置为空(NULL) 。这样,链表中所有数据元素(结点)构成一对一的逻辑关系,实现线性表的链式存储。【实验内容和要求】1、按照要求完成程序 exp2_1.c,实现顺序表的相关操作。以

3、下函数均具有返回值,若操作完成,返回 OK,操作失败返回 ERROR。函数需返回的其他数据,使用函数参数返回。exp2_1.c 部分代码如下:#include#include#define ERROR 0#define MAXSIZE 100#define OK 1typedef int ElemType; /*定义表元素的类型*/typedef struct slistElemType *list;int listsize;int length;Sqlist;数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 3Sqlist *L;/*(1)- 补充顺序表的存储分配表示,采用

4、定长和可变长度存储均可*/*函数声明*/int InitList_sq(Sqlist *L);int CreateList_sq(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

5、*L)L-list=(ElemType *)malloc(MAXSIZE*sizeof(ElemType);if(L-list=NULL)return ERROR;elseL-length=0;L-listsize=MAXSIZE;return 0;/*InitList*/*(3)- 创建具有 n 个元素的顺序表*/int CreateList_sq(Sqlist *L)int a,b,c;printf(“请输入输入数据的个数 n:“);scanf(“%d“,printf(“请输入输入的数据:“);for(b=0;blistb=c;L-length=L-length+a;return 0;/*

6、CreateList*/*(4)- 输出顺序表中的元素*/int PrintList_sq(Sqlist *L)数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 4int a;printf(“输出数据:“);for(a=0;alength;a+)printf(“%d “,L-lista);return 0;/*PrintList*/*(5)- 在顺序表的第 i 个位置之前插入新元素 e*/int ListInsert_sq(Sqlist *L,int i,ElemType e)int a=L-length-1;for(;a=i-1;a-)L-lista+1=L-lista;L

7、-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(;alength;a+)L-lista=L-lista+1;L-length-=1;return OK;/* ListDelete_sq */*(7)- 在顺序表中查找指定值元素,pos 为返回其位置序号 */int ListLocate(Sqlist *L,ElemType e,int *po

8、s)int a,b=0;for(a=0;alength;a+)if(e=L-lista)b=0;*pos=a+1;break;elseb=1;数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 5if(b=1)return 0;elsereturn OK;/* ListLocate */*定义菜单字符串数组*/int menu_select()char *menu=“n*MENU*n“,“ 1. Create Listn“, /*创建顺序表*/“ 2. Get Elementn“, /*查找顺序表中的元素 */“ 3. Insert datan“, /*插入数据*/“ 4. D

9、elete datan“, /*删除数据*/“ 0. Quitn“, /*退出*/“n*MENU*n“;char s3; /*以字符形式保存选择号*/int c,i; /*定义整形变量*/for (i=0;i4); /*选择项不在 04 之间重输*/return c; /*返回选择项,主程序根据该数调用相应的函数 */*主函数*/int main()Sqlist sl;InitList_sq(int m,k;for (;) /*无限循环*/switch (menu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/case 1:printf(“n1-Create Sqlist

10、:n“);数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 6CreateList_sq(printf(“nPrint Sqlist:n“);PrintList_sq(break;case 2:printf(“n3-GetElem from Sqlist:n“);printf(“please input search data:“);scanf(“%d“,int pos;if (!ListLocate(elseprintf(“found the element, position is %dn“,pos);printf(“nPrint Sqlist:n“);PrintList

11、_sq(break;case 3:printf(“n4-Insert from Sqlist:n“);printf(“n input insert location and data:(location,data)n“);scanf(“%d,%d“,if (ListInsert_sq(printf(“nPrint Sqlist:n“);PrintList_sq(elseprintf(“nERROR!“);break;case 4:printf(“n5-Delete from Sqlist:n“);printf(“nplease input delete locationn“);scanf(“%

12、d“,int deldata;if (ListDelete_sq(printf(“nDelete data is %dn“,deldata);printf(“nPrintSqlist:n“);PrintList_sq(else数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 7printf(“nERROR!“);break;case 0:exit(0); /*如菜单返回值为 0 程序结束 */return 0;(1)创建一个顺序表(2)查找元素位置(3)插入元素数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 8(4)删除元素2、按照要求完成程序 exp2_

13、2.c,实现单链表的相关操作。 exp2_2.c 部分代码如下:#include#include#define ERROR 0#define OK 1typedef int ElemType; /*定义表元素的类型*/*(1)- 线性表的单链表存储表示*/typedef struct LNodeElemType date;struct LNode *next;LNode,*LinkList;LNode *InitList(); /*带头结点单链表初始化*/数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 9void PrintList(LinkList L); /*输出带头结

14、点单链表的所有元素 */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 位置的元素,并由 e 返回其值*/void DestroyLinkList(LinkList L);/*释放链表及其空间*/LinkList CreateList(int n); /*创建 n 个结点的单链表*

15、/int menu_select(); /*菜单函数*/*带头结点单链表初始化*/LNode *InitList()LinkList L;L=(LNode *)malloc(sizeof(LNode); /*申请一个头结点 */if (!L) return ERROR; /*申请失败 */L-next=NULL; /*头结点的指针域置空*/return L;/*(1)- 输出带头结点单链表的所有元素*/void PrintList(LinkList L)LNode *p=L-next;int i=0;while(p)i+;printf(“n 第%d 个元素%d“,i,p-date);p=p-n

16、ext;/*PrintList*/*(2)- 在单链表的第 i 个位置插入元素 e,若插入成功返回 OK,插入失败返回ERROR*/int InsertElem(LinkList L,int i,ElemType e)LNode *p=L,*s;int j=0;while(pj+;if(!p|ji-1)return ERROR;数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 10s=(LNode *)malloc(sizeof(LNode);if(!s)return ERROR;s-date=e;s-next=p-next;p-next=s;return OK;/* Ins

17、ertElem */*(3)- 查找第 i 位置的元素,若存在返回 OK 并由 e 返回其值,若不存在返回ERROR*/int GetElem(LinkList L,int i,ElemType *e)LNode *p;int j=1;p=L-next;while(pj+;if(!p|ji)return ERROR;*e=p-date;return OK;/*GetElem*/*(4)- 删除第 i 位置的元素,成功返回 OK,并由 e 返回其值,若不成功返回ERROR,注意删除的结点必须释放其所占空间*/int DeleteElem(LinkList L,int i,ElemType *e)

18、LNode *p=L,*s;int j=0;while(pj+;if(!p|ji-1)return ERROR;s=p-next;p-next=s-next;*e=s-date;free(s);return OK;/* DeleteElem */数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 11/*(5)- 创建具有 n 个结点的单链表,创建成功返回其头指针 */LinkList CreateList(int n)LNode *p,*q,*L;L=InitList();p=L;int i=1;while(idate);q-next=NULL;p-next=q;p=q;re

19、turn 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“, /*查找元素 */“ 3. Insert datan“, /*插入元素*/“ 4. Delete datan“, /*删除元素*/“ 5. CreateLinkLi

20、stn“, /*创建具有 n 个元素的链表*/“ 0. Destroy LinkListchar s3; /*以字符形式保存选择号*/int c,i; /*定义整形变量*/数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 12for (i=0;i5); /*选择项不在 05 之间重输*/return c; /*返回选择项,主程序根据该数调用相应的函数 */int main()int i,n;ElemType e;LinkList L=NULL; /*定义指向单链表的指针 */for (;) /*无限循环*/switch (menu_select() /*调用主菜单函数,返回值

21、整数作开关语句的条件*/*值不同,执行的函数不同, break 不能省略*/case 1:printf(“n1-Init LinkList:n“);L=InitList(L);if(L!=NULL)printf(“nInitLinkList OK!n“);elseprintf(“nInitLinkList Error!n“);break;case 2:printf(“n2-GetElem from LinkList:n“);printf(“input pos=“);scanf(“%d“,if (L!=NULLprintf(“nPrintfList:n“);PrintList(L);数据结构与算

22、法实验指导 V2017常熟理工学院计算机科学与工程学院 13elseprintf(“Errorbreak;case 3:printf(“n3-Insert e into LinkList:n“);printf(“input pos=“);scanf(“%d“,printf(“input e=“);scanf(“%d“,if(L!=NULLprintf(“nPrintfList:n“);PrintList(L);elseprintf(“nInsert Error!n“);break;case 4:printf(“n4-Delete from LinkList:n“);printf(“input

23、pos=“);scanf(“%d“,if(L!=NULLprintf(“nDelete data is %dn“,e);printf(“nPrintfList:n“);PrintList(L);elseprintf(“nDelete Error!n“);break;case 5:printf(“please input n:“); /*输入单链表的元素个数*/scanf(“%d“,if (n#include#define ERROR 0#define OK 1typedef int ElemType; /*定义表元素的类型*/typedef struct LNode /*线性表的单链表存储*/

24、ElemType data;struct LNode *next; LNode,*LinkList;/*(1)-创建具有 n 个结点的无头结点的单向循环链表,返回其头指针*/LinkList CreateList(int n)LinkList L;L=(LinkList )malloc(sizeof(LinkList);LNode *q,*p;printf(“输入元素:n“);数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 18scanf(“%d“,q=L;int a;for(a=0;adata);q-next=p;q=p;q-next=L;return L;/*Creat

25、eList*/*(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,int k,int m,LinkList L)L=CreateList(n);PrintList(L);int a,length=n;LNode *q;for(a=1;

26、anext;while(length!=1)for(a=0;anext;q=L-next;L-next=q-next;printf(“被删除的数字:%dn“,q-data);free(q);length-=1;数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 19printf(“输出最终的一个数字:%d“,L-data);/*JOSEPHUS*/int main()int n,m,k;LinkList L=NULL; /*定义指向单链表的指针*/printf(“1.输入元素的个数“);printf(“ 2.输入位置“);printf(“ 3.输入人数“);while(scan

27、f(“%d%d%d“,return 0;.输入 10 2 3,表示一共有 10 个数,从第 2 个数之后开始数,数到 3 的人出局实验结果:数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 204、选做实验:设有头单链表,设计算法将表中值相同的元素仅保留一个结点。提示:指针 p 从链表的第一个元素开始,利用指针 q 从指针 p 位置开始向后搜索整个链表,删除与之值相同的元素;指针 p 继续指向下一个元素,开始下一轮的删除,直至pnull 为至,既完成了对整个链表元素的删除相同值。#include#include#define ERROR 0#define OK 1typede

28、f int ElemType;typedef struct LNodeElemType data;struct LNode *next;LNode,*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) retu

29、rn 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(“n“);/*PrintList*/数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 21LinkList CreateList(int n)LNode *p,*q,*head;int i;head=(LinkList)malloc(sizeof(LN

30、ode);head-next=NULL;p=head;for(i=0;idata);q-next=NULL;p-next=q;p=q;return head;/*CreateList*/LinkList SelectList(LinkList L)void Delete(LinkList L,int i);LinkList p,q,a;p=L-next;a=L-next;while(p!=NULL)q=p-next;while(q!=NULL)if(p-data=q-data)a-next = q-next;a=q;q=q-next;p=p-next;return L;void Destroy

31、LinkList(LinkList L)数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 22LNode *p=L,*q;while(p)q=p-next;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“,if(n=0)printf(“nError!n“);return 0;L=CreateList(n);if(L=NULL)p

32、rintf(“nInitLinkList Error!n“);return 0;PrintList(L);L=SelectList(L);PrintList(L);if(L!=NULL)DestroyLinkList(L);L=NULL;return 0;数据结构与算法实验指导 V2017常熟理工学院计算机科学与工程学院 23【实验小结】在平时的学习中,主要是老师讲我们听,只有上机的时候才操作一下,对知识的掌握和理解不够。这次课程设计让我认识到自己还有很多的不足,对知识的掌握及熟练运用不够,这让我在程序编写中遇到了很多困难。通过查找资料及向老师请教,我终于编写出了程序。 这次实验课,让我学会了做任何事都要细心耐心专心。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报