湖北理工黄石理工数据结构实验 单链表实验.docx

上传人:b****5 文档编号:8025067 上传时间:2023-01-28 格式:DOCX 页数:16 大小:148.13KB
下载 相关 举报
湖北理工黄石理工数据结构实验 单链表实验.docx_第1页
第1页 / 共16页
湖北理工黄石理工数据结构实验 单链表实验.docx_第2页
第2页 / 共16页
湖北理工黄石理工数据结构实验 单链表实验.docx_第3页
第3页 / 共16页
湖北理工黄石理工数据结构实验 单链表实验.docx_第4页
第4页 / 共16页
湖北理工黄石理工数据结构实验 单链表实验.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

湖北理工黄石理工数据结构实验 单链表实验.docx

《湖北理工黄石理工数据结构实验 单链表实验.docx》由会员分享,可在线阅读,更多相关《湖北理工黄石理工数据结构实验 单链表实验.docx(16页珍藏版)》请在冰豆网上搜索。

湖北理工黄石理工数据结构实验 单链表实验.docx

湖北理工黄石理工数据结构实验单链表实验

实验报告

实验课程名称

数据结构

班级

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;i

p1=p1->next;

for(i=1;i

L2=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上机调试单链表的基本方法,基本上掌握了单链表的插入、删除、查找、求表长、有序单链表的合并以及单链表的逆制算法的实现。

但是仍然有不足之处,需进一步掌握循环单链表的插入、删除、查找算法的实现。

四、教师批阅

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1