欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOC文档下载
 

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

  • 资源ID:105954097       资源大小:59KB        全文页数:17页
  • 资源格式: DOC        下载积分:10积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要10积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

-实验二 顺序表与链表【实验目的】1、掌握线性表中元素的前驱、后续的概念。2、掌握顺序表与链表的建立、插入元素、删除表中*元素的算法。3、对线性表相应算法的时间复杂度进展分析。4、理解顺序表、链表数据构造的特点优缺点。【实验学时】4学时【实验预习】答复以下问题:1、顺序表的存储表示假设线性表中每一个数据元素的存储空间大小为1个字节,并且以其所占存储空间的第一个字节的地址作为该元素的存储位置,则线性表中任一个数据元素的存储位置为:LOC(Ai)=LOC(A1)+(i-1)*1其中,LOC(A1)为线性表中第一个数据元素a1的存储位置,也称为线性表的起始位置首地址。typedef struct Sqlist ElemType *slist;/存储空间的基地址 int length;/表长度 int listsize;/当前分配的存储空间容量Sqlist;2、单链表的存储表示线性链表也称单链表,在每一个结点中只包含一个指针,用于指示该结点的直接后继结点,整个链表通过指针相连,最后一个结点因为没有后继结点,其指针置为空NULL。这样,链表中所有数据元素结点构成一对一的逻辑关系,实现线性表的链式存储。【实验容和要求】1、按照要求完成程序e*p2_1.c,实现顺序表的相关操作。以下函数均具有返回值,假设操作完成,返回OK,操作失败返回ERROR。函数需返回的其他数据,使用函数参数返回。e*p2_1.c局部代码如下:*include<stdio.h>*include<malloc.h>*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(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*sizeof(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;i<n;i+) printf("input data %d:",i+1); scanf("%d",&e); if(!ListInsert_sq(L,i+1,e) return ERROR; return OK;/*CreateList*/*4-输出顺序表中的元素*/int PrintList_sq(Sqlist *L) int i; for(i=1;i<=L->length;i+) printf("%5d",L->slisti-1); return OK;/*PrintList*/*5-在顺序表的第i个位置之前插入新元素e*/int ListInsert_sq(Sqlist *L,int i,ElemType e) int k; if(i<1|i>L->length+1) return ERROR; if(L->length>=L->listsize)/当前空间已满,申请新的空间 L->slist=(ElemType *)realloc(L->slist,(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(i<1|i>L->length) return ERROR; *e=L->slisti-1; for(j=i;i<L->length;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;p+) if(*p=e) *pos=i; break; i+; if(p>=end) return ERROR; else return OK; /* ListLocate */*定义菜单字符串数组*/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;i<7;i+) /*输出主菜单数组*/ 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 n;int m,k; printf("please input n:"); /*输入顺序表的元素个数*/ scanf("%d",&n); if(n=0)printf("ERROR"); for (;) /*无限循环*/ switch (menu_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 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("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: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、按照要求完成程序e*p2_2.c,实现单链表的相关操作。e*p2_2.c局部代码如下:*include<stdio.h>*include<malloc.h>*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 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(); /*菜单函数*/*带头结点单链表初始化*/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,假设插入成功返回OK,插入失败返回ERROR*/int InsertElem(LinkList L,int i,ElemType e) LNode *p=L,*s; int j=0; while(p&&j<i-1)/寻找插入位置 p=p->ne*t; j+; if(!p|j>i-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 GetElem(LinkList L,int i,ElemType *e) LNode *p; int j=1; while(p&&j<i) p=p->ne*t; j+; if(!p|j>i) 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&&j<i-1)/寻找插入位置 p=p->ne*t; j+; if(!p|j>i-1) return ERROR; 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;i<n;i+) q=(LinkList)malloc(sizeof(LNode); printf("input data %d",i+1); scanf("%d",&q->data); q->ne*t=NULL;/节点指针域置空 p->ne*t=q;/新节点连接在表末尾 p=q; return head;/*CreateList*/*释放链表及其空间*/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. Destroy LinkList&&Quitn", /*释放链表所占空间&退出*/ "n*MENU*n" ; char s3; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ for (i=0;i<8;i+) /*输出主菜单数组*/ 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; /*定义指向单链表的指针*/ 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 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="); 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("nOKn"); 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 (n<0) 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("nDestroy 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<stdio.h>*include<malloc.h>*define ERROR 0*define 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;i<=n;i+) s=(LNode*)malloc(sizeof(LNode); s->data=i; s->ne*t=NULL; if(head=NULL) head=s; else r->ne*t=s; r=s; r->ne*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=1;i<k;i+) q=p; p=p->ne*t; while(p->ne*t!=p) for(i=1;i<m;i+) q=p; p=p->ne*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); return 0;4、选做实验:设有头单链表,设计算法将表中值一样的元素仅保存一个结点。提示:指针p从链表的第一个元素开场,利用指针q从指针p位置开场向后搜索整个链表,删除与之值一样的元素;指针p继续指向下一个元素,开场下一轮的删除,直至pnull为至,既完成了对整个链表元素的删除一样值。*include<malloc.h>*include<stdio.h>*define ERROR 0*define OK 1typedef int ElemType; /*定义表元素的类型*/*1-线性表的单链表存储表示*/typedef struct LNode ElemType data; struct LNode *ne*t;LNode,*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) 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; printf("n");/*PrintList*/LinkList CreateList(int n) LNode *p,*q,*head; int i; head=(LinkList)malloc(sizeof(LNode); head->ne*t=NULL; p=head; for(i=0;i<n;i+) q=(LinkList)malloc(sizeof(LNode); printf("input data %d:",i+1); scanf("%d",&q->data); 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;void 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.

注意事项

本文(数据结构实验报告顺序表与链表)为本站会员(无***)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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