实验二 顺序表与链表

更新时间: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 #include #define ERROR 0

#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;alength;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(;alength;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;alength;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 #include #define ERROR 0 #define OK 1

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 #include #define ERROR 0 #define OK 1

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;anext; while(length!=1){ for(a=0;anext; q=L->next;

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 #include #define ERROR 0 #define OK 1

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

本文来源:https://www.bwwdw.com/article/1hk3.html

Top