单链表的存储与操作.docx

上传人:b****5 文档编号:6499459 上传时间:2023-01-07 格式:DOCX 页数:10 大小:27.15KB
下载 相关 举报
单链表的存储与操作.docx_第1页
第1页 / 共10页
单链表的存储与操作.docx_第2页
第2页 / 共10页
单链表的存储与操作.docx_第3页
第3页 / 共10页
单链表的存储与操作.docx_第4页
第4页 / 共10页
单链表的存储与操作.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

单链表的存储与操作.docx

《单链表的存储与操作.docx》由会员分享,可在线阅读,更多相关《单链表的存储与操作.docx(10页珍藏版)》请在冰豆网上搜索。

单链表的存储与操作.docx

单链表的存储与操作

单链表的存储与操作

成绩

评阅人

重庆邮电大学

课程设计实验报告

班级:

1301416

姓名:

陈昊

学号:

2014214156

指导老师:

夏晨洋

课程名称:

数据结构

实验时间:

2015年10月26日-2015年11月2日

实验地点:

数字图书馆负一楼B132

实验二单链表的存储与操作

一、实验目的

1•理解线性表的逻辑结构;

2•理解单链表的存储结构特点,

掌握单链表的存储分配要点;

3.掌握单链表的基本操作及实现,并能正确分析其时间复杂度。

二、主要数据结构描述

LinkList();//

建立只有头结点的空链表

LinkList(Ta[],intn);//

建立有n个元素的单链表

~LinkList();//

析构函数

intLength();//

求单链表的长度

TGet(inti);//

取单链表中第i个结点的兀素值

intLocate(Tx);//

求单链表中值为x的元素序号

voidInsert(inti,Tx);//

在单链表中第i个位置插入元素值为x的

结点

TDelete(inti);//

在单链表中删除第i个结点

voidPrintList();//

遍历单链表,按序号依次输出各兀素

Node*first;//单链表的头指针

在单链表中,需要有构造函数用来构造整个单链表。

需要析构函数来删除整

个单链表。

需要一个Length函数来求单链表的长度。

需要一个取值函数Get,

传入节点的编号,返回节点的值

需要一个求序号的函数,传入数据的值,返

回数据对应的编号,即在单链表中的位置。

需要一个插入函数,用来在特定的

位置插入一个节点用来存储新数据。

需要一个删除函数,用来删除某个节点,

并将该节点两端的节点连起来。

需要一个遍历函数,用以遍历单链表。

三、算法的基本思想描述

1.按位置/值查找:

按位置和按值查找的思路大体相同,需要一个工作指针来

对整个链表进行遍历,如果所遇到的编号或值与想要的一致,便会把工作指针

的信息返回。

此函数只需对链表遍历一次,所以平均时间复杂度为0(n);

2.在位置i插入一个数据元素:

此函数可以大体分成两个部分。

第一个部分是

遍历,寻找到要插入的位置,这个与上面的方法相同。

第二个部分是插入,要先申请一个新节点s,在让s的指针域等于前一个节点p的指针域,最后让p的指针域等于s。

此函数只需对链表遍历一次,所以平均时间复杂度为0(n);

3.删除位置i的数据元素:

删除函数也有两个部分,第一个与插入相同,第二个先要暂存被删节点,用以返回,再让前一个节点的指针域等于后一个节点,最后删除被删节点。

此函数只需对链表遍历一次,所以平均时间复杂度为0(n)

4.初始化单链表(有参):

有前插法和尾插法,实际上都是在链表的后面再添加一个新节点,所以时间复杂度为0(n);

5.遍历单链表、求单链表长度、销毁单链表:

这三个函数都是要遍历单链表,所以时间复杂度为0(n)。

四、运行的结果截图

£9C:

\window&Vystem32\cmd.exe

五、实验体会和收获

通过这次试验,我熟悉了如何取单链表中第i个结点的元素值,如何按位

查找位置为i的元素并输出值,如何构建一个单链表。

总之这次试验然我熟悉

了很多单链表的操作。

六、程序清单。

LinkList.h

r.-.SifndefLrnkList^K'

ineLinkLis七.Htemplate

ILzlMode

{

Tdata;

Nade*next;/■/此处也可以首9S

1;

topiateT>

classLixdiList

{

public:

>;〃建立只有头结点的空错表

LinkList(Ta['],intn):

/7龍立有力吓元素的单供袤

"LitikListO:

〃析构函勘

int-Length0;〃求苣锥義的*度

T&et(inti);仃取单错表中第i个结点的元素值

intLocate(Tx):

〃求蛍BS気中值为監的元秦J?

voidInsert(inti=Ts):

"在单粧克中第i个位BISArc®值対m的结点TDelete(inti);〃在单锥喪由删除第i个结点

voidPrintList():

"遍厉单锚表,按序号依次输岀各元辜

private

Node*first.”单甜克的头扌旨軒

};

flendif

LinkList.cpp

flinelttda*LinkLi=t.

tenclate丄assT>

[=lLiukLLat.LiiJ

[

fitst-newNode:

firST-^neKt"NULL:

]

tenclate丄assT>

l^jLiukLLatrT>..LitikList(Ta[],intu)

{

first-newNode

"生威头结虫

N&de?

*s:

r-first:

>7匡抱针初姑化

ft*上(int丄・0,,iII)

{

s-newNode<7>:

s->dat.a-a[lj:

"为毎十数组元寿建立一-TSSjSe->»eMt-e;r=s:

"幡入刊线鑰鲂点之后

\

r>ncxt-NULL.〃单祗衷龍立完卑,將纹端结点的揩制城羞空

_1

Template

template

tLinkList:

:

^LinkList()

{

J

template(classT>

£TLinkList:

:

Get(int1)

{

Node*p:

intj:

p=first->next:

j=l:

//s^p=first:

j=0;

while(p&&j

{

p=p->«ext:

〃工作指针p后移

j++:

]

if(!

p)-throw"位:

S":

elsereturnp->data;

J

template

LintLxnkLisKT)*:

:

Locate(Tx)

{

Node*p;intj;

p=f1rst->next;j=l:

if(p&4tp->next){

while(p->data!

=x)

{

p=p->next;

j++:

}

returnj:

}

elsethrow"位置":

}

template:

〈classT>

EvoidLinkList:

:

Insert(xntT龙)

{

Node*p;intj;

p=£irst;j=0;//工作指针p初始化

while(p&&j

{

p-p->next:

//工作指针p后移

j++;

}

if(!

p)throw"位蛊":

else{

Nod.e*s;

s=newNode;

s->data=x;//向內存申请一个结点s>其数据域为xs->n.exfp->next;//将结点s插入到结点p之后

p->n.ex

template

TintLirJcLifft:

:

Length()

{

Node*p$first-;

inti=0:

while(p)

{

p■p->next.:

i++:

retu.rni;

J

template^classT、

PTLinkLisKTJ11:

:

Dele-tefiitti)

{

Node*p;intj;

p-fim:

j=0;77工作指霽p初贻化

while(p磁"查拱第IT个詰点

I

p*p->next:

j++:

if(!

p11!

p->next)throw“位蛊,"结点p不存在或结点p的后继结点不存在else[

Node*q;intH:

q^p->nest;K=q->data;J7暂存神刪结fSp->n&xt=q->next:

"摘射deleq.returne.

texpiate

-voidLinkLi3-t:

:

PrintListt){

Node»p;

p=first->neKt;

屮h辽e(j)

{cout<data<nest:

LinkListMain.cpp

ElSinclude〃弓I用输入Ifi出療庫函議的头立件

MitLCluJe^LiiikLisX.cpp*//引用单槌表的竟usingespaH*.std:

E.vuidiiain()

L^nkList.沖:

ucijit<<±,A操作.mmii.

+.ry

[

a*Insert(1+4):

■a*Insvr*t(2,D),

a«Insert15):

catch(char*wrong)

{

cout«wrong:

〃如尖败提示尖败信息

}

coutXV已经插入"4,5,6”v<

co\rt«"单铤表a的长度为:

w«endl;

cout«a.Length()«endl;〃返回单铤表长滾

cout«endl;

cout«w单链表曰的元素为:

w«endl;

a.PrintList();"显示销表中所有元素

cout«endl:

cout«w|$位萱找第二个元素:

K,<

cout«w第二个元耒为:

■:

cout«a.Get

(2)«endl:

〃查栈槌表中第二个元靑

cout«endl:

cout«v|S值查拔5'•〈〈Midi:

cout«"值为5的元素位番为:

";

cout«a.Locate(5)«endl;〃直找元素5,并返回在单槌表中位蛊

cout«endl:

cout«"lA行删除4的操作"«endl:

a.Delete

(1):

〃删徐元秦4

cout«"已删除成功,单槌裘合的长度为,

cout«a.Length0«endl:

cout-<

coirt<<"铤表a中的元辜为:

?

X

a.PrintList();

intr[]={1,2,3,4,5};

LinhListb(r,5);//根扌居数组创逢单错表

cout«w执行插入操作前单槌表b为:

*«endl;

b.PrintList():

//输出单表所有元素

cout«w)S入前单锥表b的长度为:

":

cout«b.Length()«endl:

try

{

b.Insert(3>8);

}

catch.(char*wrong)

{

cout«wrong;〃如尖败提示失败信息

}

cout〈<"执行插入操作后单槌克b为:

*<

b.PrintList();//输出单铤表b所有元素

cout<<"插入启单错表b的长度为;”;

cout<

cout<

if(a.Length()){cout<<*^l行刪除第一个元素操作:

*<

b.Delete

(1):

//删踪b中第一个元表

cout«*已删餘成功,单铤裘b的匠度为一cout<

}

else{

cout<<长度为0*<

}

}

catch(char*wrong)

I

cout«wrong;//如尖败提示失败信息

cout«"Ul行插入按作后单槌喪b为:

*«endl:

b.PrintList():

〃输出单错表所有元耒

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

当前位置:首页 > 医药卫生

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

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