数据结构单链表插入、删除和修改实验报告
- 格式:doc
- 大小:244.00 KB
- 文档页数:10
1
计算机学院
实验报告
课程名称: 数据结构
实验名称: 单链表
学生姓名: ***
学生学号: ***********
实验日期: 2012
2 一、实验目的
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 3 操作结果:对上述所有元素进行保存。
(6)load
操作结果:对上述元素进行重新装载。
3.使用说明
程序执行后显示
======================
1.单链表的创建
2.单链表的显示
3.单链表的长度
4.取第i个位置的元素
5.修改第i个位置的元素
6.插入元素到单链表里
7.删除单链表里的元素
8.合并两个单链表
9.退出系统
=======================
5.源代码:
#include
using namespace std;
#define true 1
#define false 0
#define ok 1
#define error 0
#define overflow -2
typedef int Status;
typedef int ElemType;
typedef struct LNode
{ ElemType data;
struct LNode *next;
}LNode,*LinkList; 4 void CreateList(LinkList &L,int n)
{ LinkList p;
L=new LNode;
L->next=NULL;
LinkList q=L;
for(int i=1;i<=n;i++)
{ p=new LNode;
cin>>p->data;
p->next=NULL;
q->next=p;
q=p; }
}
Status GetElem(LinkList L,int i,ElemType &e)
{ LinkList p=L->next;
int j=1;
while(p&&j
{ p=p->next;
++j; }
if(!p||j>i) return error;
e=p->data;
return ok;
}
Status LinkInsert(LinkList &L,int i,ElemType e)
{ LinkList p=L;
int j=0;
while(p&&j
{ p=p->next;
++j; }
if(!p||j>i-1)
return error;
LinkList s=new LNode;
s->data=e;
s->next=p->next; 5 p->next=s;
return ok;
}
Status ListDelete(LinkList &L,int i,ElemType &e)
{ LinkList p=L;
LinkList q;
int j=0;
while(p->next&&j
{
p=p->next;
++j; }
if(!(p->next)||j>i-1) return error;
q=p->next;
p->next=q->next;
e=q->data;
delete(q);
return ok;
}
void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LinkList pa,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; 6 pb=pb->next; }
}
pc->next=pa?pa:pb;
delete(Lb);
}
void show(LinkList L)
{ LinkList p;
p=L->next;
while(p)
{ cout";
p=p->next; }
cout<
}
int Length(LinkList L,int i)
{ i=0;
LinkList p=L->next;
while(p)
{ ++i;
p=p->next; }
return i;
}
void xiugai(LinkList L)
{ int i,j=1;
ElemType k;
ElemType e,m;
LinkList p=L->next;
cout<<"请输入要修改的元素位置(0
cin>>i;
GetElem(L,i,e);
cout<<"该位置的元素:"<
cout<<"修改后的元素值:";
cin>>k;
while(p&&jnext;
++j; }
m=p->data;
p->data=k;
cout<<"修改后的单链表显示如下:"<
show(L);
}
void hebing()
{ int a,b;
LinkList La,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);
}
void main()
{ int select;
int x;
ElemType y;
LinkList list;
for(;;)
{ cout<<" 单链表的基本操作"<
cout<<" 1.单链表的创建"<
cout<<" 2.单链表的显示"<
cout<<" 4.取第i个位置的元素"<
cout<<" 5.修改第i个位置的元素"<
cout<<" 6.插入元素到单链表里"<
cout<<" 7.删除单链表里的元素"<
cout<<" 8.合并两个单链表"<
cout<<" 9.退出系统"<
cout<<"请选择:";
cin>>select;
switch(select)
{ case 1:cout<<"请输入单链表的长度:"<
cin>>x;
cout<<"请输入"<
CreateList(list,x);
break;
case 2: cout<<"单链表显示如下:"<
show(list);
break;
case 3: int s;
cout<<"单链表的长度为:"<
break;
case 4: cout<<"请选择所要取出元素的位置:";
cin>>x;
while(x<0||x>Length(list,s))
{ cout<<"输入有误,请重新输入"<
cout<<"请选择所要取出元素的位置:";
cin>>x; }
GetElem(list,x,y);
cout<<"该位置的元素为:"<