实验二 线性表链式存储运算的算法实现昆工版.docx
《实验二 线性表链式存储运算的算法实现昆工版.docx》由会员分享,可在线阅读,更多相关《实验二 线性表链式存储运算的算法实现昆工版.docx(13页珍藏版)》请在冰豆网上搜索。
实验二线性表链式存储运算的算法实现昆工版
昆明理工大学信息工程与自动化学院学生实验报告
(2013—2014学年第三学期)
课程名称:
数据结构开课实验室:
信自楼4442013年11月12日
年级、专业、班
计科122班
学号
201210405204
姓名
邹华宇
成绩
实验项目名称
线性表链式存储运算的算法实现
指导教师
胡守成
教师评语
教师签名:
年月日
注:
报告内容按实验须知中七点要求进行。
一、实验目的和要求
1.掌握线性表链式存储结构的C语言描述及运算算法的实现;
2.分析算法的空间复杂度和插入和删除的时间复杂度;
3.总结比较线性表顺序存储存储与链式存储的各自特点。
程序功能:
1.(菜单)主程序;
2.链表的建立;
3.链表的数据插入;
4.链表的数据删除;
5.链表的数据输出;
二、实验原理及基本技术路线图(方框原理图)
三、所用仪器、材料(设备名称、型号、规格等)
联想计算机一台
MicrosoftVisualc++6.0
四、程序源代码
#include
#include
#include
#include
typedefintdataType;
typedefstructnode
{
dataTypedata;
structnode*next;
}linkList;
linkList*createList()
{
intnum;
linkList*head,*s,*r;
head=NULL;
r=NULL;
printf("Enterthenumber(0tostop):
");
scanf("%d",&num);
while(num!
=00)
{
s=(linkList*)malloc(sizeof(linkList));
s->data=num;
if(head==NULL)head=s;
elser->next=s;
r=s;
printf("Enterthenumber(0tostop):
");
scanf("%d",&num);
}
if(r!
=NULL)r->next=NULL;
returnhead;
}
linkList*get(linkList*head,inti)
{
intj;
linkList*p;
p=head;
j=0;
while((p->next!
=NULL)&&(j
{
p=p->next;
j++;
}
if(i==j)returnp;
elsereturnNULL;
}
linkList*locate(linkList*head,dataTypekey)
{
linkList*p;
p=head->next;
while(p!
=NULL)
{
if(p->data!
=key)
p=p->next;
elsebreak;
}
returnp;
}
voidinsertAfter(linkList*p,dataTypex)
{
linkList*s;
s=(linkList*)malloc(sizeof(linkList));
s->data=x;
s->next=p->next;
p->next=s;
}
voidinsertBefore(linkList*p,dataTypex)
{
linkList*s;
s=(linkList*)malloc(sizeof(linkList));
s->data=p->data;
s->next=p->next;
p->next=s;
p->data=x;
}
voidinsert(linkList*L,dataTypex,inti)
{
linkList*p;
intj;
j=i-1;
p=get(L,j);
if(p==NULL)
{
printf("erro\n");
getch();
}
else{insertAfter(p,x);printf("\nInsertSucceed");getch();}
}
voiddeleteAfter(linkList*p)
{
linkList*r;
r=p->next;
p->next=r->next;
free(r);
}
voidDelete(linkList*L,inti)
{
intj;
linkList*p;
j=i-1;
p=get(L,j);
if(p!
=NULL&&p->next!
=NULL)
{deleteAfter(p);printf("\nDeleteSucceed");getch();}
else
{
printf("error\n");
getch();
}
}
voiddisplay(linkList*head)
{
inti=1;
if(head==NULL)
{
printf("EmptyList\n");
}
while(head!
=NULL)
{
printf("Index[%d]:
%d\n",i,head->data);
head=head->next;
i++;
}
}
charcaiDan()
{
charch;
do
{
printf("1:
CreateNewList\n");
printf("2:
Insert\n");
printf("3:
Delete\n");
printf("4:
Display\n");
printf("5:
Exit\n");
printf("PleaseChoose:
");
}while(ch=getch(),ch!
='1'&&ch!
='2'&&ch!
='3'&&ch!
='4'&&ch!
='5');
returnch;
}
voidmain()
{
linkList*head=NULL;
charch;
inti,key;
do
{
system("cls");
ch=caiDan();
printf("%c",ch);
getch();
printf("\n");
switch(ch)
{
case'1':
head=createList();
printf("Listwascreatedsuccessfully");getch();break;
case'2':
display(head);
if(head==NULL){getch();break;}
else{printf("\nInputKey:
");scanf("%d",&key);
printf("InputIndexuwanttoinsertafter:
");scanf("%d",&i);
insert(head,key,i);break;}
case'3':
display(head);
if(head==NULL){getch();break;}
else{printf("\nInputindexyouwanttodelete:
");scanf("%d",&i);
Delete(head,i-1);break;}
case'4':
display(head);getch();break;
case'5':
exit(0);
}
}while(ch!
='5');
}
五、运行结果
(1)创建单链表
(2)插入单链表
(3)插入单链表以后的结果
(4)删除单链表
(5)删除单链表以后的结果
(6)插入错误
(7)删除错误
六、实验总结
在做这个程序的时候,虽然遇到一些问题,但最后都被我解决,自信心上得到比较大的提升,这也是这次实践最大的收获。
同时,知识上的收获也是不可忽视的,亲手解决问题的过程也是很好的学习过程,并且积累了一些经验,相信会为以后的学习发展带来非常积极的帮助。