单链表实验报告.docx

上传人:b****6 文档编号:8112073 上传时间:2023-01-28 格式:DOCX 页数:12 大小:17.89KB
下载 相关 举报
单链表实验报告.docx_第1页
第1页 / 共12页
单链表实验报告.docx_第2页
第2页 / 共12页
单链表实验报告.docx_第3页
第3页 / 共12页
单链表实验报告.docx_第4页
第4页 / 共12页
单链表实验报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

单链表实验报告.docx

《单链表实验报告.docx》由会员分享,可在线阅读,更多相关《单链表实验报告.docx(12页珍藏版)》请在冰豆网上搜索。

单链表实验报告.docx

单链表实验报告

单链表实验报告

实验目的:

1)理解线性表的链式存储结构;

2)熟练掌握动态链表结构及有关算法的设计;

3)根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。

实验要求:

实验环境:

visualc++6.0

实验内容及数据:

1)求链表中第i个结点的指针(函数),若不存在,则返回NULL。

实验测试数据基本要求:

第一组数据:

链表长度n≥10,i分别为5,n,0,n+1,n+2

第二组数据:

链表长度n=0,i分别为0,2

2)在第i个结点前插入值为x的结点。

实验测试数据基本要求:

第一组数据:

链表长度n≥10,x=100,i分别为5,n,n+1,0,1,n+2

第二组数据:

链表长度n=0,x=100,i=5

3)删除链表中第i个元素结点。

实验测试数据基本要求:

第一组数据:

链表长度n≥10,i分别为5,n,1,n+1,0

第二组数据:

链表长度n=0,i=5

4)在一个递增有序的链表L中插入一个值为x的元素,并保持其递增

有序特性。

实验测试数据基本要求:

链表元素为(10,20,30,40,50,60,70,80,90,100),

x分别为25,85,110和8

5)将单链表L中的奇数项和偶数项结点分解开,并分别连成一个带头结点的单链表,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。

实验测试数据基本要求:

第一组数据:

链表元素为(1,2,3,4,5,6,7,8,9,10,20,

30,40,50,60)

第二组数据:

链表元素为(10,20,30,40,50,60,70,80,

90,100)

6)求两个递增有序链表L1和L2中的公共元素,并以同样方式连接成

链表L3。

实验测试数据基本要求:

第一组

第一个链表元素为(1,3,6,10,15,16,17,18,19,20)

第二个链表元素为(1,2,3,4,5,6,7,8,9,10,18,20,

30)

第二组

第一个链表元素为(1,3,6,10,15,16,17,18,19,20)

第二个链表元素为(2,4,5,7,8,9,12,22)

第三组

第一个链表元素为()

第二个链表元素为(1,2,3,4,5,6,7,8,9,10)

实验准备:

1)

求第i个节点指针:

先设一指针p,使其初值为头节点的下一指针及p=head.next,并设置一变量j作为记录节点的序号,利用循环先从头节点依次指向所数到的节点,循环条件要考虑到节点不存在的情况。

while(j!

=i&&p!

=NULL){

p=p.next;j++;returnp;}

2)在第i个结点前插入值为x的结点

首先搜索到插入的位置,然后产生节点,将x装入,将产生的节点的后继指针指向该位置的下一节点,并将该位置前一节点后继指针指向产生的节点考虑i是否满足插入条件。

while(j!

=i-1&&p!

=NULL){p=p.next;j++;}

else{s=newnode;s.data=x;s.next=p.next;p.next=s(指向产生的节点)

;}

3)删除链表中第i个元素结点

和插入类似,明确删除的节点,将该节点前一节点后继指针指向该节点的后继指针所指节点,然后删除该节点。

p指向i的前一节点u=p.next;p.next=u.next;deleteu;

4)在一个递增有序的链表L中插入一个值为x的元素,并保持其递增

有序特性。

和插入类似,先将x与表中每一元素比较,当x<=L.data时,建立节点插入该节点之前。

当指针为空时插入表尾。

5)将单链表L中的奇数项和偶数项结点分解开,并分别连成一个带头

结点的单链表,然后再将这两个新链表同时输出在屏幕上,并保留

原链表的显示结果,以便对照求解结果

先建立两个空链表A,B,与插入类似,使p=L.next开始,当序号

i为奇数插入A,否则插入B,到p==NULL;m=A.next;n=B.next;利

用循环cout<

6)求两个递增有序链表L1和L2中的公共元素,并以同样方式连接成

链表L3。

建一新表,考虑递增这一条件。

设置两指针p1,p2,分别指向两表

A,B.初值为A.next,B.next.

1.p1.data==p2.data,则插入新表。

将p1,p2后移。

2.p1.data〉p2.data,将p2后移,继续查找。

3.p1.data

反复执行比较,直到其中一表为空结束。

实验程序:

#include

#include

typedefintelementtype;

structNode

{

elementtypedata;

Node*next;

};

classlist

{

private:

Node*head;

Node*real;

public:

list();

Node*first(inti);

voidsecond(inti,elementtypex);

voidthird(inti);

voidforth(elementtypex);

//

voidfifth(list&L2,list&L3);

voidsixth(list&L1,list&L2);

voidcreat();

friendostream&operator<<(ostream&out,list&L);

};

list:

:

list()

{

head=newNode;

real=head;

}

voidlist:

:

creat()/

{

Node*u;

elementtypex;

cin>>x;

while(x!

=-1)

{

u=newNode;

u->data=x;

real->next=u;

real=u;

cin>>x;

}

real->next=NULL;

}

ostream&operator<<(ostream&out,list&L)

{

Node*p=L.head->next;

while(p!

=NULL)

{

out<data;

p=p->next;

out<<"";

}

out<<"";

returnout;

}

Node*list:

:

first(inti)

{

Node*p=head->next;intj;

while(j!

=i-1&&p!

=NULL)

{p=p->next;j++;}

returnp;

}

voidlist:

:

second(inti,elementtypex)

{

Node*p=head;intk=0;Node*s;

while(k!

=i-1&&p!

=NULL)

{p=p->next;k++;}

if(p==NULL)cerr<<"输入序列号错误";

else{

s=newNode;

s->data=x;

s->next=p->next;

p->next=s;

}

}

voidlist:

:

third(inti)

{

Node*u,*p=head;intk=0;

while(k!

=i-1&&p!

=NULL)

{p=p->next;k++;}

if(p==NULL||p->next==NULL)

cerr<<"输入序列号错误";

else

{

u=p->next;

p->next=u->next;

deleteu;

}

}

voidlist:

:

forth(elementtypex)

{

Node*p=head;Node*s;

while(p!

=NULL)

{

if(xnext->data)break;

p=p->next;

}

s=newNode;

s->data=x;

s->next=p->next;

p->next=s;

}

voidlist:

:

fifth(list&L2,list&L3)

{

Node*u;inti=0;

Node*p=head->next;

for(i=0;p!

=NULL;i++,p=p->next)

{

u=newNode;u->data=p->data;

if(i%2==0)

{

L2.real->next=u;L2.real=u;

}

else

{

L3.real->next=u;L3.real=u;

}

L2.real->next=NULL;

L3.real->next=NULL;

}

}

voidlist:

:

sixth(list&L1,list&L2)

{

Node*pa,*pb,*u;

pa=L1.head->next;

pb=L2.head->next;

while(pa!

=NULL&&pb!

=NULL)

{

if(pa->datadata)pa=pa->next;

elseif(pa->data>pb->data)pb=pb->next;

else

{

u=newNode;

u->data=pa->data;

real->next=u;

real=u;

pa=pa->next;

pb=pb->next;

}

real->next=NULL;

}

}

intmain()

{

listL1,L2,L3;

intch;inti;elementtypex;

for(;;)

{

cout<<"数据结构实验——单链表"<

cout<<"该实验的目的是根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法";

cout<

cout<<"第1题:

求链表中第i个结点的指针"<

cout<<"第2题:

在第i个结点前插入值为x的结点"<

cout<<"第3题:

删除链表中第i个元素结点"<

cout<<"第4题:

在一个递增有序的链表L中插入一个值为x的元素"<

cout<<"第5题:

将单链表L中的奇数项和偶数项结点分解开"<

cout<<"第6题:

求两个递增有序链表L1和L2中的公共元素"<

cout<<"退出程序:

0"<

cout<

cout<<"请选择一道题";

cin>>ch;

switch(ch)

{

case1:

{

cout<<"请输入数据,输入-1结束"<

L1.creat();

cout<<"请输入结点号i"<>i;

L1.first(i);

break;

}

case2:

{

cout<<"请输入数据,输入-1结束"<

L1.creat;

cout<

cout<<"请输入结点号i和数据x"<

cin>>i>>x;

L1.second(i,x);

cout<

break;

}

case3:

{

cout<<"请输入数据,输入-1结束"<

L1.creat();

cout<

cout<<"请输入所删除结点号i"<

cin>>i;L1.third(i);

cout<

break;

}

case4:

{

cout<<"请输入数据,输入-1结束"<

L1.creat();

cout<

cout<<"请输入数据x"<

cin>>x;L1.forth(x);

cout<

break;

}

case5:

{

cout<<"请输入数据,输入-1结束"<

L1.creat();

cout<

L1.fifth(L2,L3);

cout<

cout<

break;

}

case6:

{

cout<<"请输入数据,输入-1结束"<

L1.creat();

L2.creat();

L3.sixth(L1,L2);

cout<

cout<

cout<

break;

}

case0:

{

cout<

exit

(1);

break;

}

default:

{

cout<<"输入错误,请重新选择"<

}

}

}

return0;

}

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

当前位置:首页 > 工程科技 > 环境科学食品科学

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

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