数据结构单链表插入删除和修改实验报告.docx
《数据结构单链表插入删除和修改实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构单链表插入删除和修改实验报告.docx(12页珍藏版)》请在冰点文库上搜索。
数据结构单链表插入删除和修改实验报告
计算机学院
实验报告
课程名称:
数据结构
实验名称:
单链表
学生姓名:
朱孝彬
学生学号:
20110511001
实验日期:
2012
一、实验目的
1.理解数据结构中带头结点单链表的定义和逻辑图表示方法。
2.掌握单链表中结点结构的C++描述。
3.熟练掌握单链表的插入、删除和查询算法的设计与C++实现。
二、实验内容
1.编制一个演示单链表插入、删除、查找等操作的程序。
三、实验步骤
1.需求分析
本演示程序用C++6.0编写,完成单链表的生成,任意位置的插入、删除,以及确定某一元素在单链表中的位置。
①输入的形式和输入值的范围:
插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。
在所有输入中,元素的值都是整数。
②输出的形式:
在所有三种操作中都显示操作是否正确以及操作后单链表的内容。
其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。
③程序所能达到的功能:
完成单链表的生成(通过插入操作)、插入、删除、查找操作。
④测试数据:
A.插入操作中依次输入11,12,13,14,15,16,生成一个单链表
B.查找操作中依次输入12,15,22返回这3个元素在单链表中的位置
C.删除操作中依次输入2,5,删除位于2和5的元素
2.概要设计
1)为了实现上述程序功能,需要定义单链表的抽象数据类型:
(1)insert
初始化状态:
单链表可以不为空集;操作结果:
插入一个空的单链表L。
(2)decelt
操作结果:
删除已有的单链表的某些结点。
(3)display
操作结果:
将上述输入的元素进行排列显示。
(4)modify
操作结果:
将上述输入的某些元素进行修改。
(5)save
操作结果:
对上述所有元素进行保存。
(6)load
操作结果:
对上述元素进行重新装载。
3.使用说明
程序执行后显示
======================
1.单链表的创建
2.单链表的显示
3.单链表的长度
4.取第i个位置的元素
5.修改第i个位置的元素
6.插入元素到单链表里
7.删除单链表里的元素
8.合并两个单链表
9.退出系统
=======================
5.源代码:
#include
usingnamespacestd;
#definetrue1
#definefalse0
#defineok1
#defineerror0
#defineoverflow-2
typedefintStatus;
typedefintElemType;
typedefstructLNode
{ElemTypedata;
structLNode*next;
}LNode,*LinkList;
voidCreateList(LinkList&L,intn)
{LinkListp;
L=newLNode;
L->next=NULL;
LinkListq=L;
for(inti=1;i<=n;i++)
{p=newLNode;
cin>>p->data;
p->next=NULL;
q->next=p;
q=p;}
}
StatusGetElem(LinkListL,inti,ElemType&e)
{LinkListp=L->next;
intj=1;
while(p&&j
{p=p->next;
++j;}
if(!
p||j>i)returnerror;
e=p->data;
returnok;
}
StatusLinkInsert(LinkList&L,inti,ElemTypee)
{LinkListp=L;
intj=0;
while(p&&j{p=p->next;
++j;}
if(!
p||j>i-1)
returnerror;
LinkLists=newLNode;
s->data=e;
s->next=p->next;
p->next=s;
returnok;
}
StatusListDelete(LinkList&L,inti,ElemType&e)
{LinkListp=L;
LinkListq;
intj=0;
while(p->next&&j{
p=p->next;
++j;}
if(!
(p->next)||j>i-1)returnerror;
q=p->next;
p->next=q->next;
e=q->data;
delete(q);
returnok;
}
voidMergeList(LinkList&La,LinkList&Lb,LinkList&Lc)
{
LinkListpa,pc,pb;
pa=La->next;
pb=Lb->next;
Lc=pc=La;
while(pa&&pb)
{if(pa->data<=pb->data)
{pc->next=pa;
pc=pa;
pa=pa->next;}
else
{pc->next=pb;
pc=pb;
pb=pb->next;}
}
pc->next=pa?
pa:
pb;
delete(Lb);
}
voidshow(LinkListL)
{LinkListp;
p=L->next;
while(p)
{cout<data<<"-->";
p=p->next;}
cout<}
intLength(LinkListL,inti)
{i=0;
LinkListp=L->next;
while(p)
{++i;
p=p->next;}
returni;
}
voidxiugai(LinkListL)
{inti,j=1;
ElemTypek;
ElemTypee,m;
LinkListp=L->next;
cout<<"请输入要修改的元素位置(0
";
cin>>i;
GetElem(L,i,e);
cout<<"该位置的元素:
"<cout<<"修改后的元素值:
";
cin>>k;
while(p&&j
{p=p->next;
++j;}
m=p->data;
p->data=k;
cout<<"修改后的单链表显示如下:
"<show(L);
}
voidhebing()
{inta,b;
LinkListLa,Lb,Lc;
cout<<"请输入第一个有序链表的长度:
"<cin>>a;
cout<<"请输入第一个有序链表的元素共("<"<CreateList(La,a);
show(La);
cout<<"请输入第二个有序链表的长度:
"<cin>>b;
cout<<"请输入第二个有序链表的元素共("<
"<CreateList(Lb,b);
show(Lb);
MergeList(La,Lb,Lc);
cout<<"合并后的有序链表如下:
"<show(Lc);
}
intmain()
{intselect;
intx;
ElemTypey;
LinkListlist;
for(;;)
{cout<<"单链表的基本操作"<cout<<"1.单链表的创建"<cout<<"2.单链表的显示"<cout<<"3.单链表的长度"<cout<<"4.取第i个位置的元素"<cout<<"5.修改第i个位置的元素"<cout<<"6.插入元素到单链表里"<cout<<"7.删除单链表里的元素"<cout<<"8.合并两个单链表"<cout<<"9.退出系统"<cout<<"请选择:
";
cin>>select;
switch(select)
{case1:
cout<<"请输入单链表的长度:
"<cin>>x;
cout<<"请输入"<CreateList(list,x);
break;
case2:
cout<<"单链表显示如下:
"<show(list);
break;
case3:
ints;
cout<<"单链表的长度为:
"<break;
case4:
cout<<"请选择所要取出元素的位置:
";
cin>>x;
while(x<0||x>Length(list,s))
{cout<<"输入有误,请重新输入"<cout<<"请选择所要取出元素的位置:
";
cin>>x;}
GetElem(list,x,y);
cout<<"该位置的元素为:
"<break;
case5:
xiugai(list);break;
case6:
cout<<"请选择要插入的位置:
";cin>>x;
while(x<0||x>Length(list,s))
{cout<<"输入有误,请重新输入"<cout<<"请选择所要插入元素的位置:
";
cin>>x;}
cout<<"要插入的元素值:
";
cin>>y;
LinkInsert(list,x,y);
cout<<"插入后单链表显示如下:
"<show(list);
break;
case7:
cout<<"请选择要删除的位置:
";cin>>x;
while(x<0||x>Length(list,s))
{cout<<"输入有误,请重新输入"<cout<<"请选择所要删除元素的位置:
";
cin>>x;}
ListDelete(list,x,y);
cout<<"要删除的元素值:
"<cout<<"删除后的单链表显示如下:
"<show(list);
break;
case8:
hebing();
break;
case9:
exit(0);
break;
default:
cout<<"输入有误,请重新输入"<break;
}
}
}
6.测试结果
四、实验总结(结果分析和体会)
单链表的最后一个元素的next为null,所以,一旦遍历到末尾结点就不能再重新开始;而循环链表的最后一个元素的next为第一个元素地址,可返回头结点进行重新遍历和查找。