湖北理工黄石理工数据结构实验 单链表实验.docx
《湖北理工黄石理工数据结构实验 单链表实验.docx》由会员分享,可在线阅读,更多相关《湖北理工黄石理工数据结构实验 单链表实验.docx(16页珍藏版)》请在冰豆网上搜索。
湖北理工黄石理工数据结构实验单链表实验
实验报告
实验课程名称
数据结构
班级
09计科一班
实验项目名称
单链表实验
指导老师
祁文青
姓名
***
学 号
****
评 分
实验地点
K4-206
实验日期
9.30-10.14
一、实验目的和要求
1、掌握用VisualC++6.0上机调试单链表的基本方法
2、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现
3、进一步掌握循环单链表的插入、删除、查找算法的实现
二、实验任务
(一)1、单链表基本操作的实现。
要求生成单链表时,可以键盘上读取元素,用链式存储结构实现存储。
2、源代码
#include
#include
#include
#include
typedefintelemtype;
typedefstructlnode
{
elemtypedate;
structlnode*next;
}lnode;
lnode*creat(void)
{
lnode*p2,*p1;
lnode*head;
intn;
n=0;
p1=p2=(lnode*)malloc(sizeof(lnode));
head=NULL;
cin>>p1->date;
while(p1->date>0)
{
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(lnode*)malloc(sizeof(lnode));
cin>>p1->date;
}
p2->next=NULL;
returnhead;
}
voidprint(lnode*head)
{
lnode*p;
p=head;
if(head==NULL)
cout<<"空表";
if(head!
=NULL)
do
{
cout<date;
p=p->next;
}while(p!
=NULL);
cout<}
lnode*del(lnode*&head,inti)
{
lnode*p1,*p2;
intj=0;
p1=head;
if(head==NULL)
return0;
if(i==1)
{
head=head->next;
free(p1);
}
else
{
while(p1->next&&j{
p2=p1;
p1=p1->next;
j++;
}
if(p1->next==0||j>i-1)
cout<<"没有发现"<else
{
p2->next=p1->next;
free(p1);
}
}
returnhead;
}
lnode*insert(lnode*&head,inti,elemtypee)
{
lnode*p1,*p2,*s;
intj=0;
p1=head;
s=(lnode*)malloc(sizeof(lnode));
s->date=e;
if(head==NULL&&i==1)
head=s;
else
{
while(p1->next&&j{
p2=p1;
p1=p1->next;
j++;
}
p2->next=s;
s->next=p1;
}
returnhead;
}
intmain()
{
lnode*head;
head=creat();
inti;
elemtypee;
print(head);
intnum;
cout<<"请输入要删除的第几位数:
"<cin>>num;
del(head,num);
print(head);
cout<<"请输入在第几位插入什么数:
"<cin>>i>>e;
insert(head,i,e);
print(head);
return0;
}
3、运行结果
4、结果分析
单步执行可以看出用单链表时,由于不要求逻辑上相邻的元素在物理位置上也相邻,所以单链表没有顺序存储结构素具有的弱点,但是这也导致了单链表不可以随机存取的优点。
(二)1、已知单链表la和lb中的数据元素按非递减有序排列,将la和lb中的数据元素,合并为一个新的单链表lc,lc中的数据元素仍按非递减有序排列。
要求①不破坏la表和lb表的结构。
②破坏la表和lb表的结构。
2、源代码
#include
#include
#include
#include
typedefintelemtype;
typedefstructlnode
{
elemtypedate;
structlnode*next;
}lnode;
lnode*hebing(lnode*head1,lnode*head2,lnode*&head);
lnode*creat(void)
{
lnode*p2,*p1;
lnode*head;
intn;
n=0;
p1=p2=(lnode*)malloc(sizeof(lnode));
head=NULL;
cin>>p1->date;
while(p1->date>0)
{
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(lnode*)malloc(sizeof(lnode));
cin>>p1->date;
}
p2->next=NULL;
returnhead;
}
voidprint(lnode*head)
{
lnode*p;
p=head;
if(head==NULL)
cout<<"空表";
if(head!
=NULL)
do
{
cout<date;
p=p->next;
}while(p!
=NULL);
cout<}
intmain()
{
lnode*head1,*head2,*head;
hebing(head1,head2,head);
cout<<"合并后:
"<print(head);
return0;
}
lnode*hebing(lnode*head1,lnode*head2,lnode*&head)
{
head1=creat();
print(head1);
head2=creat();
print(head2);
lnode*p1,*p2,*p3,*p4;
p1=head1;
p2=head2;
p4=p3=(lnode*)malloc(sizeof(lnode));
head=NULL;
intn=1;
while(p1&&p2)
{
if(p1->date<=p2->date)
{
p3->date=p1->date;
p1=p1->next;
}
else
{
p3->date=p2->date;
p2=p2->next;
}
if(n==1)
head=p3;
else
p4->next=p3;
p4=p3;
p3=(lnode*)malloc(sizeof(lnode));
n++;
}
if(p1==NULL)
{
while(p2)
{
p3->date=p2->date;
p2=p2->next;
p4->next=p3;
p4=p3;
p3=(lnode*)malloc(sizeof(lnode));
}
}
else
{
while(p1)
{
p3->date=p1->date;
p1=p1->next;
p4->next=p3;
p4=p3;
p3=(lnode*)malloc(sizeof(lnode));
}
}
p4->next=NULL;
return(head);
}
3、运行结果
4、结果分析
此段代码可以实现将两个链表合并成一个有序链表。
(三)1、编程实现两个循环单链表的合并。
2、源代码
#include
#include
typedefintElemType;
typedefstructLNode
{ElemTypedata;
structLNode*next;
}LNode,*LinkList;
intprint(LinkList&L,intn);
inthebing(LinkListL1,intn,LinkListL2,intm,LinkList&L);
voidcreat(LinkList&L,intn)
{
LNode*p1,*p2;
p1=p2=(LNode*)malloc(sizeof(LNode));
L=NULL;
inti;
for(i=0;i{
cin>>p1->data;
if(i==0)
L=p1;
else
p2->next=p1;
p2=p1;
p1=(LNode*)malloc(sizeof(LNode));
}
p2->next=L;
}
intmain()
{
LNode*L1,*L2,*L;
cout<<"请输入第一个单链表的长度:
"<intn,m;
cin>>n;
creat(L1,n);
print(L1,n);
cout<<"请输入第二个单链表的长度:
"<cin>>m;
creat(L2,m);
print(L2,m);
cout<<"合并后"<hebing(L1,n,L2,m,L);
print(L,m+n);
return0;
}
intprint(LinkList&L,intn)
{
inti;
for(i=0;i{
cout<data<<"";
L=L->next;
}
return0;
}
inthebing(LinkListL1,intn,LinkListL2,intm,LinkList&L)
{
inti;
LNode*p1;
L=L1;
p1=L1;
for(i=1;ip1=p1->next;
for(i=1;iL2=L2->next;
p1->next=L2->next;
return0;
}
3、运行结果
4、结果分析
此段代码实现的功能是将两个循环单链表进行合并。
(四)1、将一循环单链表就地逆置
#include
#include
typedefintElemType;
typedefstructLNode
{ElemTypedata;
structLNode*next;
}LNode,*LinkList;
intprint(LinkList&L,intn);
intnizhi(LNode*&L,intn);
voidcreat(LinkList&L,intn)
{
LNode*p1,*p2;
p1=p2=(LNode*)malloc(sizeof(LNode));
L=NULL;
inti;
for(i=0;i{
cin>>p1->data;
if(i==0)
L=p1;
else
p2->next=p1;
p2=p1;
p1=(LNode*)malloc(sizeof(LNode));
}
p2->next=L;
}
intmain()
{
LNode*L;
cout<<"请输入个数:
"<intn;
cin>>n;
creat(L,n);
print(L,n);
nizhi(L,n);
cout<<"逆制后..."<print(L,n);
return0;
}
intprint(LinkList&L,intn)
{
inti;
for(i=0;i{
cout<data<<"";
L=L->next;
}
cout<return0;
}
intnizhi(LNode*&L,intn)
{
LNode*p1,*L1,*p2,*r;
inti;
p1=L;
L1=p2=(LNode*)malloc(sizeof(LNode));
for(i=0;i{
p2->data=p1->data;
p1=p1->next;
L1=p2;
if(i==0)
r=L1;
p2=(LNode*)malloc(sizeof(LNode));
p2->next=L1;
}
r->next=L1;
L=L1;
return0;
}
3、运行结果
4、结果分析
此段代码用以实现链表的逆制。
三、结论
掌握了用VC++6.0上机调试单链表的基本方法,基本上掌握了单链表的插入、删除、查找、求表长、有序单链表的合并以及单链表的逆制算法的实现。
但是仍然有不足之处,需进一步掌握循环单链表的插入、删除、查找算法的实现。
四、教师批阅