数据结构实验报告单链表Word格式文档下载.docx
- 文档编号:21686475
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:15
- 大小:71.57KB
数据结构实验报告单链表Word格式文档下载.docx
《数据结构实验报告单链表Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告单链表Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
2.程序分析
2.1存储结构
单链表的存储:
(1)链表用一组任意的存储单元来存放线性表的结点。
这组存储单元既可以是连续的,也可以是不连续的,甚至零散地分布在内存的某些位置。
(2)链表中结点的逻辑次序和物理次序不一定相同。
为了能正确表示结点间的逻辑关系,在存储每个元素值的同时,还要存储该元素的直接后继元素的位置信息,这个信息称为指针或链。
结点结构
┌──┬──┐data域---存放结点值的数据域
│data│next│next域---存放结点的直接后继的地址的指针域
└──┴──┘
单链表在内存中的存储示意
地址内存单元
a[3]
1080H
……
a[1]
10C0H
a[4]
^
a[2]
1000H
头指针1020H
front…………
2.2关键算法分析
1、关键算法:
(1)头插法
自然语言描述:
a:
在堆中建立新结点
b:
将a[i]写入到新结点的数据域
c:
修改新结点的指针域
d:
修改头结点的指针域。
将新结点加入链表中
伪代码描述
Node<
T>
*s=newNode<
s->
data=a[i]
c:
next=front->
next;
d:
front->
next=s
(2)尾插法
在堆中建立新结点:
将a[i]写入到新结点的数据域:
将新结点加入到链表中
修改修改尾指针
r->
next=s;
r=s
(3)遍历打印函数
判断该链表是否为空链表,如果是,报错
如果不是空链表,新建立一个temp指针
将temp指针指向头结点
打印temp指针的data域
e:
逐个往后移动temp指针,直到temp指针的指向的指针的next域为空
Iffront->
next==NULL
Throw”anemptylist”
Node<
*temp=front->
while(temp->
next)
cout<
<
temp->
data<
"
"
;
temp=temp->
(4)获取链表长度函数
判断该链表是否为空链表,如果是,输出长度0
如果不是空链表,新建立一个temp指针,初始化整形数n为0
判断temp指针指向的结点的next域是否为空,如果不是,n加一,否则returnn
使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next域为0,返回n
ifront->
Node<
(5)析构/删除函数
新建立一个指针,指向头结点
判断要释放的结点是否存在,
暂时保存要释放的结点
移动a中建立的指针
释放要释放的指针
伪代码描述
*p=front
while(p)
front=p
p=p->
next
deletefront
(6)按位查找函数
初始化工作指针p和计数器j,p指向第一个结点,j=1
循环以下操作,直到p为空或者j等于1
:
p指向下一个结点
j加1
若p为空,说明第i个元素不存在,抛出异常
否则,说明p指向的元素就是所查找的元素,返回元素地址
*p=front->
j=1;
while(p&
&
j!
=1)
:
j++
if(!
p)throw”error”
returnp
(7)按位查找函数
循环以下操作,找到这个元素或者p指向最后一个结点
判断p指向的结点是不是要查找的值,如果是,返回j,否则p指向下一个结点,并且j的值加一
如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息
if(p->
next==x)returnj
p=p->
j++
return“error”
(8)插入函数
将要插入的结点的数据写入到新结点的数据域
修改前一个指针的指针域,使其指向新插入的结点的位置
s-data=p->
data
next=p->
p->
data=x
(9)删除函数
从第一个结点开始,查找要删除的位数i前一个位置i-1的结点
设q指向第i个元素
将q元素从链表中删除
保存q元素的数据
释放q元素
q=p->
next=q->
x=q->
deleteq
2、代码详细分析(插入):
(1)从第一个结点开始,查找节点,使它的数据比x大,设p指向该结点:
while(x>
data){p=p->
}
(2)新建一个节点s,把p的数据赋给s:
s->
data=p->
data;
(3)把s加到p后面:
p->
(4)p节点的数据用x替换:
data=x;
示意图如图所示
p
x
s
3、关键算法的时间复杂度:
O
(1)
3.程序运行结果
1.流程图:
2、结果截图
3.测试结论:
可以正确的对链表进行插入,删除,取长度,输出操作。
且插入任意一个元素后,链表的顺序依然是由小到大。
4、给出代码(文末)
4.总结
1、问题
书中已经给出析构、查找、插入、删除过程代码,遍历以及获取长度代码需要自己写出,刚开始写时一直出现各种基本错误,后来经过不断调试解决了问题。
编写main函数时,调用插入删除等操作的代码一直编写失败,后自行查找资料后解决
2、收获
这次编程任务完成地较为艰辛,但做完之后大大加深了自己对书中各个知识点的印象和理解。
也学会了一些编写算法的小技巧,要有耐心,多看书复习知识。
总之,这次实验使我印象深刻。
#include<
iostream>
usingnamespacestd;
template<
classT>
structNode
{
Tdata;
structNode*next;
};
classLinkList
public:
LinkList()//无参构造
{
front=newNode<
front->
next=NULL;
}
LinkList(Ta[],intn);
//头插法
//LinkList(Ta[],intn);
//尾插法
voidPrintList();
//按次序遍历
intGetLength();
//获取线性表的长度
Node<
*Get(inti);
//获取第i个位置上的元素结点的地址
intLocate(Tx);
//查找
voidInsert(inti,Tx);
//插入
TDelete(inti);
//删除
~LinkList();
//销毁
private:
*front;
LinkList<
:
LinkList(Ta[],intn)//头插法
front=newNode<
front->
for(inti=n-1;
i>
=0;
i--)
*s=newNode<
//建立新结点
s->
data=a[i];
//给新结点数据域赋值
next=front->
//修改新结点的指针域
next=s;
//修改头指针的指针域
}/*
template<
LinkList<
LinkList(Ta[],intn)//尾插法
front=newNode<
*r=front;
for(inti=0;
i<
n;
i++)
Node<
data=a[i];
r->
r=s;
next=NULL;
}*/
voidLinkList<
PrintList()
*p=front;
while(p->
next!
=NULL){
p=p->
cout<
data<
endl;
intLinkList<
GetLength()
intn=0;
=NULL){p=p->
n++;
returnn;
*LinkList<
Get(inti)
*p=front->
intj=1;
while(p&
j!
=i)
p=p->
j++;
returnp;
Insert(inti,Tx)
if(i!
=1)
p=Get(i-1);
if(p)
data=x;
next=p->
p->
elsethrow"
位置错误"
TLinkList<
Delete(inti)
=1)p=Get(i-1);
if(!
p&
!
next)throw"
*q=p->
p->
next=q->
Tx=q->
deleteq;
returnx;
~LinkList()
while(p)
deletefront;
front=p;
intmain()
constintn=8;
inta[n]={1,2,3,4,5,6,7,8};
int>
list(a,n);
cout<
线性表的长度为:
<
list.GetLength()<
遍历线性表结果为:
endl;
list.PrintList();
插入一个值后的线性表为:
list.Insert(1,0);
删除一个值后的线性表为:
list.Delete
(1);
第个位置上的元素地址是:
list.Get
(2)<
list.~LinkList();
system("
pause"
);
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 单链表