单链表 实验报告.docx
《单链表 实验报告.docx》由会员分享,可在线阅读,更多相关《单链表 实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
单链表实验报告
单链表实验报告
一、实验目的与要求
1、实现单链表的建立;
2、掌握单链表的插入、删除和查找运算;
3、熟练进行C语言源程序的编辑调试。
二、实验内容
(1)建立带表头结点的单链表;
首先输入结束标志,然后建立循环逐个输入数据,直到输入结束标志。
数据输入的函数为:
LNode*createtail()
{
LNode*s,*r;
intx,tag;
printf("inputthesignofending:
");/*输入结束标志*/
scanf("%d",&tag);
h=(LNode*)malloc(sizeof(LNode));/*建立表头结点*/
h->data=tag;
r=h;
printf("inputthedata:
");
scanf("%d",&x);
while(x!
=tag)/*建立循环逐个输入数据*/
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->link=s;
r=s;
scanf("%d",&x);
}
r->link=NULL;
returnh;
}
(2)输出单链表中所有结点的数据域值;
首先获得表头结点地址,然后建立循环逐个输出数据,直到地址为空。
数据输出的函数为:
voidoutput(LNode*h)
{
LNode*r;
inti;
r=h;
for(i=1;r->link!
=NULL;i++)
{
printf("%d.%d\n",i,r->link->data);
r=r->link;
}
}
(3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y;
建立两个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,建立循环扫描链表。
当当前结点指针域不为空且数据域等于x的时候,申请结点并给此结点数据域赋值为y,然后插入当前结点后面,退出函数;当当前结点指针域为空的时候,申请结点并给此结点数据域赋值为y,插入当前结点后面,退出函数。
数据插入函数为:
voidinsert(LNode*h)
{
LNode*r,*s;
intx,y;
printf("Inputthedatathatyouwanttoinsert:
\n");
printf("x=");
scanf("%d",&x);/*输入x值*/
printf("y=");
scanf("%d",&y);/*输入y值*/
r=h;
r=r->link;
for(;;r=r->link)
{
if(r->data==x)/*当当前结点指针域不为空且数据域等于x的时候…*/
{
s=(LNode*)malloc(sizeof(LNode));
s->data=y;
s->link=r->link;
r->link=s;
break;
}
if(r->link==NULL)/*当当前结点指针域为空的时候*/
{
s=(LNode*)malloc(sizeof(LNode));
s->data=y;
s->link=NULL;
r->link=s;
break;
}
}
}
(4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。
建立三个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,最后一个备用;建立整形变量l=0;建立循环扫描链表。
当当前结点指针域为空的时候,如果当前结点数据域等于k,删除此结点,l++,跳出循环,结束操作;如果当前结点数据域不等于k,跳出循环,结束操作。
当当前结点指针域不为空的时候,如果当前结点数据域等于k,删除此结点,l++,继续循环操作;如果当前结点数据域不等于k,指针向后继续扫描。
循环结束后函数返回变量l的值,l便是删除的结点的个数。
数据删除函数为:
intdel(LNode*h)
{
LNode*r,*s,*t;
intk,l=0;
printf("Inputthedatathatyouwanttodelete:
");
scanf("%d",&k);
r=h;
s=r;
r=r->link;
for(;;)
{
if(r->link==NULL)/*当当前结点指针域为空的时候*/
{
if(r->data==k)/*如果当前结点数据域不等于k…*/
{
l++;
s->link=NULL;
free(r);
break;
}
elsebreak;/*如果当前结点数据域等于k…*/
}
else/*当当前结点指针域不为空的时候*/
{
if(r->data==k)/*如果当前结点数据域不等于k…*/
{
l++;
t=r;
s->link=t->link;
r=t->link;
free(t);
}
else{r=r->link;s=s->link;}/*如果当前结点数据域不等于k…*/
}
}
returnl;
}
完整的源程序为:
#include"stdio.h"
#include"conio.h"
#defineDataTypeint
typedefstructnode
{
DataTypedata;
structnode*link;
}LNode;
LNode*h;
LNode*createtail()
{
LNode*s,*r;
intx,tag;
system("cls");
printf("inputthesignofending:
");
scanf("%d",&tag);
h=(LNode*)malloc(sizeof(LNode));
h->data=tag;
r=h;
printf("inputthedata:
");
scanf("%d",&x);
while(x!
=tag)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->link=s;
r=s;
scanf("%d",&x);
}
r->link=NULL;
returnh;
}
voidoutput(LNode*h)
{
LNode*r;
inti;
system("cls");
r=h;
for(i=0;r->link!
=NULL;i++)
{
printf("data[%d]=%d\n",i,r->link->data);
r=r->link;
}
getch();
}
voidinsert(LNode*h)
{
LNode*r,*s;
intx,y;
system("cls");
printf("Inputthedatathatyouwanttoinsert:
\n");
printf("x=");
scanf("%d",&x);
printf("y=");
scanf("%d",&y);
r=h;
r=r->link;
for(;;r=r->link)
{
if(r->data==x)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=y;
s->link=r->link;
r->link=s;
break;
}
if(r->link==NULL)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=y;
s->link=NULL;
r->link=s;
break;
}
}
}
intdel(LNode*h)
{
LNode*r,*s,*t;
intk,l=0;
system("cls");
printf("Inputthedatathatyouwanttodelete:
");
scanf("%d",&k);
r=h;
s=r;
r=r->link;
for(;;)
{
if(r->link==NULL)
{
if(r->data==k)
{
l++;
s->link=NULL;
free(r);
break;
}
elsebreak;
}
else
{
if(r->data==k)
{
l++;
t=r;
s->link=t->link;
r=t->link;
free(t);
}
else{r=r->link;s=s->link;}
}
}
returnl;
}
voidnodata()
{
system("cls");
printf("Youhadnotinputdata.\n\n\n");
printf("Press\"Enter\"toreturn");
getch();
}
main()
{
inta,b=1,c,l;
h=-1;
for(;b==1;)
{
system("cls");
printf("1.Createalinearlist.\n");
printf("2.Outputthedataoflinearlist.\n");
printf("3.Insertdata.\n");
printf("4.Deletedata.\n");
printf("5.Exit\n");
scanf("%d",&a);
switch(a)
{
case1:
createtail();break;
case2:
{
if(h==-1)nodata();
elseoutput(h);break;
}
case3:
{
if(h==-1)nodata();
elseinsert(h);break;
}
case4:
{
if(h==-1)nodata();
else{l=del(h);printf("Youhavedeleted%ddata(s)\n",l);}break;
}
default:
b=3;break;
}
}
printf("end.");
getch();
}
三、实验结果和数据处理
(1)初始界面:
程序以菜单形式列出5个功能:
1.Createalinearlist.(新建一个链表)
2.Outputthedataoflinearlist.(输出链表的数据)
3.Insertdata.(插入数据)
4.Deletedata.(删除数据)
5.Exit.(退出)
需要注意的是,程序必须先运行第一项后才能运行二三四项,否则会提示出错:
(2)新建一个链表:
首先输入结束标志,这里我设为-100,当我在输入数据的时候输入-100便停止数据输入。
然后输入数据,在此我便输入1-9九个数字作为九个数据,然后输入-100停止操作,返回初始界面。
到此便成功建立一个链表。
(3)输出链表的数据:
(4)插入数据:
例如我想在数据为3后面插入一个数据100:
完成操作后输出数据为:
(5)删除数据:
例如我想删除刚刚插入的数据100:
完成操作后输出数据为:
需要注意的是,删除操作会把链表中所有数值域中的数值等同于指定数字的结点全部删除。
四、总结
实验之前由于准备不够充分,所以堂上实验时只完成了建立单链表和数据的输出,而后面两个实验要求也是用来很多时间长完成的。
以后做实验前,一定要做好充分的准备,有一个清晰的思路,遇到更复杂的实验也一定能轻松完成。
五、问题与讨论
1、简要分析程序的时间复杂度;
设n为输入的数据个数。
根据程序代码,四个实验要求各只有一个循环,实验的运行时间为:
4n,则程序的时间复杂度为O(n)
2、在实验过程中遇到的问题及解决办法。
虽然数据结构比C语言更加复杂,但是通过参照和模仿书上的例子,用心去学习,还是能把复杂的问题克服的。