单链表的存储与操作.docx
《单链表的存储与操作.docx》由会员分享,可在线阅读,更多相关《单链表的存储与操作.docx(10页珍藏版)》请在冰豆网上搜索。
单链表的存储与操作
单链表的存储与操作
成绩
评阅人
重庆邮电大学
课程设计实验报告
班级:
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七.HtemplateILzlMode
{
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中的元辜为:
?
Xa.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():
〃输出单错表所有元耒