ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:21.04KB ,
资源ID:2931344      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-2931344.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构实验报告顺序表与链表.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

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

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

3、需返回的其他数据,使用函数参数返回。exp2_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)

4、;int CreateList_sq(Sqlist *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*s

5、izeof(ElemType); if(!L-slist) 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

6、*/*(4)-输出顺序表中的元素*/int PrintList_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-slis

7、t,(L-listsize+INCREM)*sizeof(ElemType); 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-s

8、listi-1; for(j=i;ilength;j+) L-slistj-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 */*定义菜单字符串数组*/

9、int menu_select() char *menu=n*MENU*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;i7;i+) /*输出主菜单数组*/ printf(%s,menui); do printf(nEnter you choice(04):)

10、; /*在菜单窗口外显示提示信息*/ scanf(%s,s); /*输入选择项*/ 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

11、_select() /*调用主菜单函数,返回值整数作开关语句的条件*/ case 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 pri

12、ntf(found the element, position is %dn,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);

13、 else printf(nERROR!); break; case 4: printf(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

14、0: exit(0); /*如菜单返回值为0程序结束*/ return 0;2、按照要求完成程序exp2_2.c,实现单链表的相关操作。exp2_2.c部分代码如下:#include#include#define ERROR 0#define OK 1typedef int ElemType; /*定义表元素的类型*/*(1)-线性表的单链表存储表示*/typedef struct LNode ElemType data; struct LNode *next;LNode,*LinkList;LNode *InitList(LinkList L); /*带头结点单链表初始化*/void Pri

15、ntList(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位置的元素,并由e返回其值*/void DestroyLinkList(LinkList L);/*释放链表及其空间*/LinkList CreateList(int n);

16、/*创建n个结点的单链表*/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; p=L-next; while(p!=NULL) printf(%5d,p-data); p=

17、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&jnext; j+; if(!p|ji-1) return ERROR; s=(LNode*)malloc(sizeof(LNode); if(!s) return ERROR; s-data=e; s-next=p-next; p-next=s; return OK;/* InsertElem */*(3)-查找第

18、i位置的元素,若存在返回OK并由e返回其值,若不存在返回ERROR*/int GetElem(LinkList L,int i,ElemType *e) LNode *p; int j=1; while(p&jnext; 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;

19、while(p&jnext; j+; if(!p|ji-1) return ERROR; s=p-next; p-next=s-next; *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-next=NULL; p=head; for(i=0;idata); q-next=NULL;/节点指针域置空 p-n

20、ext=q;/新节点连接在表末尾 p=q; return head;/*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, /*

21、删除元素*/ 5. CreateLinkListn, /*创建具有n个元素的链表*/ 0. Destroy 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

22、); /*选择项不在05之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/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);

23、else printf(nInitLinkList Error!n); break; case 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 exists!); break; case 3: printf(n3-Insert e into LinkList:n); printf

24、(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); break; case 4: printf(n4-Delete from LinkList:n); printf(input pos=); scanf(%d,&i); if(L!=NULL&DeleteElem(L,i,&e) printf(n

25、OKn); printf(nDelete data is %dn,e); printf(nPrintfList: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(nPrintfLi

26、st: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;3、循环链表的应用(约瑟夫回环问题)用整数序列1,2,3,n表示顺序坐在圆桌周围的人,并采用循环链表作为存储结构。任意位置k开始计数,计到m让此位置的人出局,重复上述过程,直至只剩下最后一个人。依次输出每个出局的人的序号。提示:用一个无头结点的循环单链表来实现n个元素的存储。exp2_3.c部分代码如下:#include#include#define ERROR 0#define OK 1typedef int ElemType; /*定义表元素的类型*/typedef struct LNode /*线性表的单链表存储*/ ElemType data; struct LNode *next; LNode,*

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2