实验二 顺序表与链表
更新时间:2024-06-17 12:59:01 阅读量: 综合文库 文档下载
- 实验二小推荐度:
- 相关推荐
《数据结构与算法》实验指导V2017
常熟理工学院
《数据结构与算法》实验指导与报告书
__2017_学年 第__1__ 学期
专 业: 物联网工程___________________________ __ 学 号: __________________________ ____ 姓 名: ________________________________ __ 实验名称:顺序表与链表_______________________________ 实验地点:N6-210_____________________________ ____ 指导教师:聂盼红__________________________ ___
计算机科学与工程学院
2017
常熟理工学院计算机科学与工程学院
1
《数据结构与算法》实验指导V2017 实验二 顺序表与链表
【实验目的】
1、掌握线性表中元素的前驱、后续的概念。
2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。 3、对线性表相应算法的时间复杂度进行分析。 4、理解顺序表、链表数据结构的特点(优缺点)。
【实验学时】
4学时
【实验预习】
回答以下问题:
1、顺序表的存储表示
在顺序表中,任一数据元素的存放位置是从起始位置开始、与该数据元素的位序成正比的对应存储位置,借助LOC(ai)=LOC(a1)+(i-1)*1 确定,则顺序表是一种随机存取的存储结构。
2、单链表的存储表示
线性链表也称单链表,在每一个结点中只包含一个指针,用于指示该结点的直接后继结点,整个链表通过指针相连,最后一个结点因为没有后继结点,其指针置为空(NULL)。这样,链表中所有数据元素(结点)构成一对一的逻辑关系,实现线性表的链式存储。
【实验内容和要求】
1、按照要求完成程序exp2_1.c,实现顺序表的相关操作。以下函数均具有返回值,若操作完成,返回OK,操作失败返回ERROR。函数需返回的其他数据,使用函数参数返回。exp2_1.c部分代码如下:
#include
#define MAXSIZE 100 #define OK 1
typedef int ElemType; /*定义表元素的类型*/
typedef struct slist{ ElemType *list; int listsize; int length; }Sqlist;
常熟理工学院计算机科学与工程学院
2
《数据结构与算法》实验指导V2017
Sqlist *L;
/*(1)---补充顺序表的存储分配表示,采用定长和可变长度存储均可*/ /*函数声明*/
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 *L) {
L->list=(ElemType *)malloc(MAXSIZE*sizeof(ElemType)); if(L->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(\
printf(\请输入输入的数据:\ for(b=0;b
scanf(\ L->list[b]=c; }
L->length=L->length+a; return 0; }/*CreateList*/
/*(4)---输出顺序表中的元素*/ int PrintList_sq(Sqlist *L)
常熟理工学院计算机科学与工程学院
3
《数据结构与算法》实验指导V2017 {
int a;
printf(\输出数据:\
for(a=0;a
printf(\ \ 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->list[a+1]=L->list[a]; L->list[i-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->list[i-1];
for(;a
L->list[a]=L->list[a+1]; L->length-=1; return OK; }/* ListDelete_sq */
/*(7)---在顺序表中查找指定值元素,pos为返回其位置序号*/ int ListLocate(Sqlist *L,ElemType e,int *pos) {
int a,b=0;
for(a=0;a
if(e==L->list[a]) {
b=0;
*pos=a+1; break; } else
b=1; }
常熟理工学院计算机科学与工程学院
4
《数据结构与算法》实验指导V2017 if(b==1)
return 0; else
return OK; }/* ListLocate */
/*定义菜单字符串数组*/ int menu_select() {
char *menu[]={\ \ /*创建顺序表*/
\ /*查找顺序表中的元素*/ \ /*插入数据*/ \ /*删除数据*/ \ /*退出*/
\ };
char s[3]; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/
for (i=0;i<7;i++) /*输出主菜单数组*/ printf(\ do {
printf(\ /*在菜单窗口外显示提示信息*/ scanf(\ /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整形数*/ }
while (c<0||c>4); /*选择项不在0~4之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/ }
/*主函数*/ int main() {
Sqlist sl;
InitList_sq(&sl); int m,k;
for (;;) /*无限循环*/ {
switch (menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/ {
case 1:
printf(\ CreateList_sq(&sl);
常熟理工学院计算机科学与工程学院
5
《数据结构与算法》实验指导V2017 printf(\ PrintList_sq(&sl); break; case 2:
printf(\ printf(\ scanf(\ int pos;
if (!ListLocate(&sl,k,&pos)) printf(\ else {
printf(\ printf(\ PrintList_sq(&sl); }
break; case 3:
printf(\
printf(\ scanf(\ if (ListInsert_sq(&sl,m,k)) {
printf(\
printf(\ PrintList_sq(&sl); } else
printf(\ break; case 4:
printf(\
printf(\ scanf(\ int deldata;
if (ListDelete_sq(&sl,k,&deldata)) {
printf(\
printf(\ printf(\ PrintList_sq(&sl); } else
printf(\
常熟理工学院计算机科学与工程学院
6
《数据结构与算法》实验指导V2017 break; case 0:
exit(0); /*如菜单返回值为0程序结束*/ } }
return 0; }
(1)创建一个顺序表
(2)查找元素位置
(3)插入元素
常熟理工学院计算机科学与工程学院
7
《数据结构与算法》实验指导V2017
(4)删除元素
2、按照要求完成程序exp2_2.c,实现单链表的相关操作。exp2_2.c部分代码如下:
#include
typedef int ElemType; /*定义表元素的类型*/
/*(1)---线性表的单链表存储表示*/ typedef struct LNode {
ElemType date; struct LNode *next; }LNode,*LinkList;
LNode *InitList(); /*带头结点单链表初始化*/
常熟理工学院计算机科学与工程学院
8
《数据结构与算法》实验指导V2017 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->next=NULL; /*头结点的指针域置空*/ return L; }
/*(1)---输出带头结点单链表的所有元素*/ void PrintList(LinkList L) {
LNode *p=L->next; int i=0; while(p) {
i++;
printf(\第%d个元素%d\ 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 p=p->next; j++; } if(!p||j>i-1) return ERROR; s=(LNode *)malloc(sizeof(LNode)); 常熟理工学院计算机科学与工程学院 9 《数据结构与算法》实验指导V2017 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 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 p=p->next; j++; } if(!p||j>i-1) return ERROR; s=p->next; p->next=s->next; *e=s->date; free(s); return OK; }/* DeleteElem */ /*(5)---创建具有n个结点的单链表,创建成功返回其头指针*/ LinkList CreateList(int n) 常熟理工学院计算机科学与工程学院 10 《数据结构与算法》实验指导V2017 { LNode *p,*q,*L; L=InitList(); p=L; int i=1; while(i<=n) { q=(LNode *)malloc(sizeof(LNode)); printf(\输入链表的结点date %d: \ scanf(\ 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个元素的链表*/ \释放链表所占空间&退出*/ \ }; char s[3]; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ for (i=0;i<8;i++) /*输出主菜单数组*/ 常熟理工学院计算机科学与工程学院 11 《数据结构与算法》实验指导V2017 { printf(\ } do { printf(\ /*在菜单窗口外显示提示信息*/ scanf(\ /*输入选择项*/ c=atoi(s); /*将输入的字符串转化为整形数*/ } while (c<0||c>5); /*选择项不在0~5之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/ } int main() { int i,n; ElemType e; LinkList L=NULL; /*定义指向单链表的指针*/ for (;;) /*无限循环*/ { switch (menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/ { /*值不同,执行的函数不同,break 不能省略*/ case 1: printf(\ L=InitList(L); if(L!=NULL) printf(\ else printf(\ break; case 2: printf(\ printf(\ scanf(\ if (L!=NULL&&GetElem(L,i,&e)) { printf(\ printf(\ PrintList(L); } else printf(\ break; 常熟理工学院计算机科学与工程学院 12 《数据结构与算法》实验指导V2017 case 3: printf(\ printf(\ scanf(\ printf(\ scanf(\ if(L!=NULL&&InsertElem(L,i,e)) { printf(\ printf(\ PrintList(L); } else printf(\ break; case 4: printf(\ printf(\ scanf(\ if(L!=NULL&&DeleteElem(L,i,&e)) { printf(\ printf(\ printf(\ PrintList(L); } else printf(\ break; case 5: printf(\ /*输入单链表的元素个数*/ scanf(\ if (n<0) { printf(\ break; } printf(\ L=CreateList(n); if (L==NULL) { printf(\ break; } 常熟理工学院计算机科学与工程学院 13 《数据结构与算法》实验指导V2017 printf(\ PrintList(L); break; case 0: printf(\ if(L!=NULL) { DestroyLinkList(L); L=NULL; } exit(0); /*如菜单返回值为0程序结束*/ } } return 0; } 实验结果: (1)初始化链表: (2)查找元素: 常熟理工学院计算机科学与工程学院 14 《数据结构与算法》实验指导V2017 (3)插入数据: (4)删除数据: 常熟理工学院计算机科学与工程学院 15 《数据结构与算法》实验指导V2017 (5)创建链表: (6)销毁和退出链表: 常熟理工学院计算机科学与工程学院 16 《数据结构与算法》实验指导V2017 3循环链表的应用(约瑟夫回环问题、) 用整数序列1,2,3,…,n表示顺序坐在圆桌周围的人,并采用循环链表作为存储结构。任意位置k开始计数,计到m让此位置的人出局,重复上述过程,直至只剩下最后一个人。依次输出每个出局的人的序号。 提示:用一个无头结点的循环单链表来实现n个元素的存储。exp2_3.c部分代码如下: #include typedef int ElemType; /*定义表元素的类型*/ typedef struct LNode /*线性表的单链表存储*/ { 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\ scanf(\ 常熟理工学院计算机科学与工程学院 17 《数据结构与算法》实验指导V2017 q=L; int a; for(a=0;a p=(LNode *)malloc(sizeof(LNode)); scanf(\ q->next=p; q=p; } q->next=L; return L; }/*CreateList*/ /*(2)---输出无头结点循环单链表的所有元素*/ void PrintList(LinkList L) { printf(\输出表中的元素:\ LNode *p; printf(\ p=L->next; while(p!=L){ printf(\ 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;a L->next=q->next; printf(\被删除的数字:%d\\n\ free(q); length-=1; } 常熟理工学院计算机科学与工程学院 18 《数据结构与算法》实验指导V2017 printf(\输出最终的一个数字:%d\}/*JOSEPHUS*/ int main() { int n,m,k; LinkList L=NULL; /*定义指向单链表的指针*/ printf(\输入元素的个数\ printf(\输入位置\ printf(\输入人数\ while(scanf(\个元素从k位置开始每m个报数*/ JOSEPHUS(n,k,m,L); return 0; } .输入10 2 3,表示一共有10个数,从第2个数之后开始数,数到3的人出局 实验结果: 常熟理工学院计算机科学与工程学院 19 《数据结构与算法》实验指导V2017 4、选做实验:设有头单链表,设计算法将表中值相同的元素仅保留一个结点。 提示:指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;指针p继续指向下一个元素,开始下一轮的删除,直至p==null为至,既完成了对整个链表元素的删除相同值。 #include typedef int ElemType; typedef struct LNode { ElemType 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) return ERROR; L->next=NULL; return L; } /*输出带头结点单链表的所有元素 */ void PrintList(LinkList L) { LinkList p; p=L->next; int i=1; while(p) { printf(\ p=p->next; } printf(\}/*PrintList*/ 常熟理工学院计算机科学与工程学院 20 《数据结构与算法》实验指导V2017 LinkList CreateList(int n) { LNode *p,*q,*head; int i; head=(LinkList)malloc(sizeof(LNode)); head->next=NULL; p=head; for(i=0;i q=(LinkList)malloc(sizeof(LNode)); printf(\ scanf(\ 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 DestroyLinkList(LinkList L) { 常熟理工学院计算机科学与工程学院 21 《数据结构与算法》实验指导V2017 LNode *p=L,*q; while(p) { q=p->next; free(p); p=q; } }/* DestroyLinkList */ int main() { int n; L=InitList(L); if(L==NULL) { printf(\ return 0; } printf(\ scanf(\ if(n<=0) { printf(\ return 0; } L=CreateList(n); if(L==NULL) { printf(\ return 0; } PrintList(L); L=SelectList(L); PrintList(L); if(L!=NULL) { DestroyLinkList(L); L=NULL; } return 0; } 常熟理工学院计算机科学与工程学院 22 《数据结构与算法》实验指导V2017 【实验小结】 在平时的学习中,主要是老师讲我们听,只有上机的时候才操作一下,对知识的掌握和理解不够。这次课程设计让我认识到自己还有很多的不足,对知识的掌握及熟练运用不够,这让我在程序编写中遇到了很多困难。通过查找资料及向老师请教,我终于编写出了程序。 这次实验课,让我学会了做任何事都要细心耐心专心。 常熟理工学院计算机科学与工程学院 23
正在阅读:
实验二 顺序表与链表06-17
美丽的白鹭作文400字07-12
华民慈善基金会申请书word版11-12
趣味识字,音形义紧密联系10-25
变压吸附(PSA)法制氧操作规程05-13
中小学教师学习师德师风心得体会04-02
高速立式加工中心静动态特性分析及结构改进06-12
甲米安达曼海滩渡假村(Andaman Beach Resort)08-15
幼儿园中班社会教案(优秀9篇)03-25
医院感染科医生个人工作总结08-02
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 顺序
- 实验
- 2.2014年设施农业项目申报指南
- 计算机二级Access期末考试复习题
- 迪士尼神奇英语重点单词和句子(上册)
- 建德市小学科学2010年度优质课比赛教学实录
- 浅谈如何在教育中运用动画片
- 在学校附近开服装店好吗,渠道网告诉您该怎么做
- 第15期中国企业家特训班名录
- freemarker语法完整版
- 电梯维保工作指导规范
- 部编版小学二年级语文上册第二单元测试题及答案
- FLAC3D各种命令笔记
- 苏教版一年级上册数学期末质量检测试题
- 魏书生语文知识树
- 真题2018年江苏省常州市中考数学试卷(含解析)
- 2013质量年报
- 电子商务对我国未来经济的影响
- 2012年上海市公务员考试行测真题答案及解析
- 高一物理 第一章 运动的描述 教案 - 图文
- 省厅关于统一规范使用新版建筑工程施工质量验收资料-苏建办[2015
- 变电运行的安全管理与事故防范-最新资料