数据结构实验报告单链表Word格式.docx
- 文档编号:15965653
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:13
- 大小:47.82KB
数据结构实验报告单链表Word格式.docx
《数据结构实验报告单链表Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告单链表Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
6、销毁
7、其他:
可自行定义
编写测试main()函数测试线性表的正确性。
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--)
Node<
*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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 单链表
![提示](https://static.bdocx.com/images/bang_tan.gif)