链表的基本操作数据结构实验报告.docx

上传人:b****0 文档编号:17553323 上传时间:2023-07-26 格式:DOCX 页数:19 大小:39.29KB
下载 相关 举报
链表的基本操作数据结构实验报告.docx_第1页
第1页 / 共19页
链表的基本操作数据结构实验报告.docx_第2页
第2页 / 共19页
链表的基本操作数据结构实验报告.docx_第3页
第3页 / 共19页
链表的基本操作数据结构实验报告.docx_第4页
第4页 / 共19页
链表的基本操作数据结构实验报告.docx_第5页
第5页 / 共19页
链表的基本操作数据结构实验报告.docx_第6页
第6页 / 共19页
链表的基本操作数据结构实验报告.docx_第7页
第7页 / 共19页
链表的基本操作数据结构实验报告.docx_第8页
第8页 / 共19页
链表的基本操作数据结构实验报告.docx_第9页
第9页 / 共19页
链表的基本操作数据结构实验报告.docx_第10页
第10页 / 共19页
链表的基本操作数据结构实验报告.docx_第11页
第11页 / 共19页
链表的基本操作数据结构实验报告.docx_第12页
第12页 / 共19页
链表的基本操作数据结构实验报告.docx_第13页
第13页 / 共19页
链表的基本操作数据结构实验报告.docx_第14页
第14页 / 共19页
链表的基本操作数据结构实验报告.docx_第15页
第15页 / 共19页
链表的基本操作数据结构实验报告.docx_第16页
第16页 / 共19页
链表的基本操作数据结构实验报告.docx_第17页
第17页 / 共19页
链表的基本操作数据结构实验报告.docx_第18页
第18页 / 共19页
链表的基本操作数据结构实验报告.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

链表的基本操作数据结构实验报告.docx

《链表的基本操作数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《链表的基本操作数据结构实验报告.docx(19页珍藏版)》请在冰点文库上搜索。

链表的基本操作数据结构实验报告.docx

链表的基本操作数据结构实验报告

大学数据结构实验报告

课程名称数据结构实验第(四)次实验实验名称链表的基本操作

学生姓名于歌专业班级学号

实验成绩指导老师(签名)日期2018年10月01日

一、实验目的

1.学会定义单链表的结点类型,实现对单链表的一些基本操作和具体的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。

2.掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。

二、实验要求

1.预习C语言中结构体的定义与基本操作方法。

2.对单链表的每个基本操作用单独的函数实现。

3.编写完整程序完成下面的实验内容并上机运行。

4.整理并上交实验报告。

三、实验内容:

1.编写程序完成单链表的下列基本操作:

(1)初始化单链表La

(2)在La中插入一个新结点

(3)删除La中的某一个结点

(4)在La中查找某结点并返回其位置

(5)打印输出La中的结点元素值

(6)清空链表

(7)销毁链表

2.构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。

四、思考与提高:

1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作?

2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?

五、实验设计

1.编写程序完成单链表的下列基本操作:

(1)初始化单链表La

LinkListInitList()

{

inti,value,n;

LinkListH=(LinkList)malloc(sizeof(LNode));

LinkListP=H;

P->next=NULL;

do{

printf("请输入链表的长度:

");

scanf("%d",&n);

if(n<=0)

printf("输入有误请重新输入!

\n");

}while(n<=0);

printf("请输入各个元素:

\n");

for(i=0;i

{

scanf("%d",&value);

LinkListNEW=(LinkList)malloc(sizeof(LNode));

NEW->data=value;

P->next=NEW;

NEW->next=NULL;

P=NEW;

}

printf("链表建立成功!

\n");

returnH->next;

}

(2)在La中插入一个新结点

LinkListInsertList(LinkListL,inti,ElemTypevalue)

{

LinkListh,q,t=NewLNode(t,value);

intx=0;

h=q=L;

if(i==1)

t->next=h,h=t;

else

{

while(x++

q=q->next;

t->next=q->next;

q->next=t;

}

printf("插入成功!

\n");

returnh;

}

(3)删除La中的某一个结点

LinkListDeleteList(LinkListL,inti)

{

LinkListh,q,de;

intx=0;

h=q=L;

intt;

if(i==1)

h=h->next;

else

{

while(x++

q=q->next;

de=q->next;

if(de->next==NULL)

q->next=NULL;

else

q->next=de->next;

}

printf("删除成功!

\n");

returnh;

}

(4)在La中查找某结点并返回其位置

StatusLocateList(LinkListL,ElemTypevalue)

{

LinkListq=L;

inti=0,t;

while(q!

=NULL)

{

i++;

if(q->data==value)

{

printf("该结点在链表中的位置为第%d个\n",i);

returnOK;

}

q=q->next;

}

printf("该链表中没有该结点!

\n");

returnERROR;

}

(5)打印输出La中的结点元素值

StatusPrint(LinkListL)

{

LinkListq=L;

printf("该链表的每个元素为:

\n");

while(q!

=NULL)

{

printf("%8d",q->data);

q=q->next;

}

printf("\n");

returnOK;

}

(6)清空链表

LinkListEmptyList(LinkListL)

{

free(L->data);

L->next=NULL;

printf("清空成功!

\n");

returnL;

}

(7)销毁链表

LinkListFreeList(LinkListL)

{

printf("释放成功!

\n");

free(L);

}

(8)主函数

intmain()

{

LinkListL=InitList();

intn,i,j;

Pr();

scanf("%d",&n);

while(n>0&&n<7)

{

switch(n)

{

case1:

printf("请输入要插入的结点的值和插入的位置:

");

scanf("%d%d",&i,&j);

InsertList(L,j,i);

break;

case2:

printf("请输入要删除的结点的位置:

");

scanf("%d",&i);

DeleteList(L,i);

break;

case3:

printf("请输入要查找的结点的值:

");

scanf("%d",&i);

LocateList(L,i);

break;

case4:

Print(L);

break;

case5:

EmptyList(L);

break;

case6:

FreeList(L);

break;

}

Pr();

scanf("%d",&n);

}

if(n==7)

printf("退出成功!

");

return0;

}

2.构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc

LinkListConnectList(LinkListLa,LinkListLb)

{

LinkListLc,a,b,c;

a=La;

b=Lb;

if(La->datadata)

Lc=La,a=a->next;

else

Lc=Lb,b=b->next;

c=Lc;

while(a!

=NULL||b!

=NULL)

{

if(a==NULL)

c->next=b,break;

if(b==NULL)

c->next=a;break;

if(a->datadata)

c->next=a,a=a->next,c=c->next;

else

c->next=b,b=b->next,c=c->next;

returnLc;

}

3.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作

LinkListConnectList(LinkListLa,LinkListLb)

{

inti=1;

LinkListLc,a,b,c,q,p;

a=La;

b=Lb;

if(La->datadata)

Lc=La;a=a->next;

else

Lc=Lb;b=b->next;

c=Lc;

while(a!

=NULL||b!

=NULL)

{

if(a==NULL)

c->next=b,break;

if(b==NULL)

c->next=a,break;

if(a->datadata)

c->next=a,a=a->next,c=c->next;

else

c->next=b,b=b->next,c=c->next;

}

c=Lc;

q=c->next;

while(q!

=NULL)

{

if(c->data==q->data)

{

c->next=q->next;

}

c=c->next;

q=c->next;

}

returnLc;

}

4.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?

StatusPartList(LinkListLc)

{

intn1=0,n2=0;

LinkListLa,Lb,L;

LinkLista,b;

L=Lc;

while(L!

=NULL)

{

if(L->data%2==0)

{

if(n1==0)

{

a=La=L;

L=L->next;

}

else

{

a->next=L;

L=L->next;

}

}

else

{

if(n2==0)

{

b=Lb=L;

L=L->next;

}

else

{

b->next=L;

L=L->next;

}

}

}

a->next=NULL;

b->next=NULL;

returnOK;

}

六、实验测试

1.编写程序完成单链表的下列基本操作:

七、总结

附录1:

源代码

#include

#include

#defineOK1

#defineERROR0

#defineOVERFLOW-2

typedefintElemType;

typedefintStatus;

typedefstructLNode

{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

LinkListNewLNode(LNode*P,ElemTypedata)

{

P=(LNode*)malloc(sizeof(LNode));

P->data=data;

P->next=NULL;

returnP;

}

LinkListInitList()

{

inti,value,n;

LinkListH=(LinkList)malloc(sizeof(LNode));

LinkListP=H;

P->next=NULL;

do

{

printf("请输入链表的长度:

");

scanf("%d",&n);

if(n<=0)

printf("输入有误请重新输入!

\n");

}

while(n<=0);

printf("请输入各个元素:

\n");

for(i=0;i

{

scanf("%d",&value);

LinkListNEW=(LinkList)malloc(sizeof(LNode));

NEW->data=value;

P->next=NEW;

NEW->next=NULL;

P=NEW;

}

printf("链表建立成功!

\n");

returnH->next;

}

LinkListInsertList(LinkListL,inti,ElemTypevalue)

{

LinkListh,q,t=NewLNode(t,value);

intx=0;

h=q=L;

if(i==1)

{

t->next=h;

h=t;

}

else

{

while(x++

q=q->next;

t->next=q->next;

q->next=t;

}

printf("插入成功!

\n");

returnh;

}

LinkListDeleteList(LinkListL,inti)

{

LinkListh,q,de;

intx=0;

h=q=L;

intt;

if(i==1)

h=h->next;

else

{

while(x++

q=q->next;

de=q->next;

if(de->next==NULL)

q->next=NULL;

else

q->next=de->next;

}

printf("删除成功!

\n");

returnh;

}

StatusLocateList(LinkListL,ElemTypevalue)

{

LinkListq=L;

inti=0,t;

while(q!

=NULL)

{

i++;

if(q->data==value)

{

printf("该结点在链表中的位置为第%d个\n",i);

returnOK;

}

q=q->next;

}

printf("该链表中没有该结点!

\n");

returnERROR;

}

StatusPrint(LinkListL)

{

LinkListq=L;

printf("该链表的每个元素为:

\n");

while(q!

=NULL)

{

printf("%8d",q->data);

q=q->next;

}

printf("\n");

returnOK;

}

LinkListEmptyList(LinkListL)

{

free(L->data);

L->next=NULL;

printf("清空成功!

\n");

returnL;

}

LinkListFreeList(LinkListL)

{

printf("释放成功!

\n");

free(L);

}

voidPr()

{

printf("\n1.插入新结点\n");

printf("2.删除链表中的结点\n");

printf("3.查找结点\n");

printf("4.输出链表\n");

printf("5.清空链表\n");

printf("6.销毁链表\n");

printf("7.退出\n");

printf("请输入要使用的功能:

");

}

intmain()

{

LinkListL=InitList();

intn,i,j;

Pr();

scanf("%d",&n);

while(n>0&&n<7)

{

switch(n)

{

case1:

printf("请输入要插入的结点的值和插入的位置:

");

scanf("%d%d",&i,&j);

InsertList(L,j,i);

break;

case2:

printf("请输入要删除的结点的位置:

");

scanf("%d",&i);

DeleteList(L,i);

break;

case3:

printf("请输入要查找的结点的值:

");

scanf("%d",&i);

LocateList(L,i);

break;

case4:

Print(L);

break;

case5:

EmptyList(L);

break;

case6:

FreeList(L);

break;

}

Pr();

scanf("%d",&n);

}

if(n==7)

printf("退出成功!

");

return0;

}

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

当前位置:首页 > 农林牧渔 > 林学

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

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