北邮数据结构实验报告实验一线性表Word格式.docx
- 文档编号:15008314
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:13
- 大小:67.09KB
北邮数据结构实验报告实验一线性表Word格式.docx
《北邮数据结构实验报告实验一线性表Word格式.docx》由会员分享,可在线阅读,更多相关《北邮数据结构实验报告实验一线性表Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
4、查找
5、获取链表长度
6、销毁
7、其他:
可自行定义
编写测试main()函数测试线性表的正确性。
2.程序分析
2.1存储结构
链表的具体存储表示为:
1用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
2链表中结点的逻辑次序和物理次序不一定相同。
为了能正确表示结点间的逻辑关系,
在存储每个结点值的同时,还必须存储指示其后继结点的地址信息(称为指针)
链表的结点结构
data|next|
data域--存放结点值的数据域
—ik-
■
next域--存放结点的直接后继的地址(位置)的指针域(链域)
front
1000H
a[3]
1080H
4020H
a[1]
10C0H
a[4]
A
a[2]
地址内存单元
头指针
2.2关键算法分析
1关键算法:
1:
头插法
自然语言描述:
a:
在堆中建立新结点
b:
将a[i]写入到新结点的数据域
c:
修改新结点的指针域
d:
修改头结点的指针域。
将新结点加入链表中伪代码描述
Node<
T>
*s=newNode<
b:
s->
data=a[i]
next=front->
next;
front->
next=s
2:
尾插法
在堆中建立新结点:
将a[i]写入到新结点的数据域:
将新结点加入到链表中
修改修改尾指针
伪代码描述
r->
next=s;
r=s
3:
析构/删除函数
新建立一个指针,指向头结点
判断要释放的结点是否存在,
暂时保存要释放的结点
移动a中建立的指针e:
释放要释放的指针伪代码描述
*p=front
while(p)
front=p
p=p->
next
e:
deletefront
4:
按位查找函数
初始化工作指针p和计数器j,p指向第一个结点,j=1
循环以下操作,直到p为空或者j等于1
b1:
p指向下一个结点
b2:
j加1
若p为空,说明第i个元素不存在,抛出异常
否则,说明p指向的元素就是所查找的元素,返回元素地址伪代码描述
*p=front->
j=1;
while(p&
&
j!
=1)
b2:
j++
if(!
p)throw”error”
returnp
5:
循环以下操作,找到这个元素或者p指向最后一个结点b1:
判断p
指向的结点是不是要查找的值,如果是,返回j,否则p指向下一个结点,并且j
的值加一
如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息
if(p->
next==x)returnj
returnerror
6:
插入函数
将要插入的结点的数据写入到新结点的数据域
修改前一个指针的指针域,使其指向新插入的结点的位置伪代码描述
;
s-data=p->
data
next=p->
p->
data=x
7:
删除函数
从第一个结点开始,查找要删除的位数i前一个位置i-1的结点
设q指向第i个元素
将q元素从链表中删除
保存q元素的数据
释放q元素伪代码描述
q=p->
next
next=q->
x=q->
deleteq
遍历打印函数
判断该链表是否为空链表,如果是,报错
如果不是空链表,新建立一个temp指针
将temp指针指向头结点
打印temp指针的data域
伪代码描
逐个往后移动temp指针,直到temp指针的指向的指针的next域为空述
Iffront->
next==NULL
Throw”anemptylist”
Node<
*temp=front->
while(temp->
next)
{cout<
<
temp->
data<
"
temp=temp->
}
9:
获取链表长度函数
判断该链表是否为空链表,如果是,输出长度0
如果不是空链表,新建立一个temp指针,初始化整形数n为0
判断temp指针指向的结点的next域是否为空,如果不是,n加一,否则returnn
使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next域为0,返回n伪代码描述
intn=0
ifront->
n=0;
else
{Node<
while(temp->
n++;
returnn;
2、代码详细分析:
(1)从第一个结点开始,查找节点,使它的数据比x大,设p指向该结点:
while(x>
data){p=p->
(2)新建一个节点s,把p的数据赋给s:
s->
data=p->
data;
(3)把s力口至Up后面:
next=p->
next;
p->
next=s;
(4)p节点的数据用x替换:
data=x;
示意图如图所示
3、关键算法的时间复杂度:
0
(1)
3.程序运行结果
程序截图
1.流程图:
f\
开始
LJ
r
初始化一个对象
2.测试条件:
插入、删除元素的位置一定要在链表的长度范围之内。
3.测试结论:
可以正确的对链表进行插入,删除,取长度,输出操作。
且插入任意一个元素后,链表的顺序依然是由小到大。
4•总结
1•调试时出现的问题及解决的方法:
(1)刚开始时用NULL置空最后一个节点的指针域,发现调试时出现NULL未声明的情况。
最后发现用0去置空最后一个节点的指针域,调试成功。
(2)刚开始遍历总是不能完全遍历链表。
最后发现循环语句中两个句子顺序写反,更正顺序后,调试成功。
2•心得体会:
这道题是相对比较基础,目的是实现线性表的基本功能,书上也几乎给出了所有的模板
类的定义,但是在自己进行编程时还是出了很多问题。
通过这个实例,我对模板类的定义与
使用有了个初步的了解,了解了单链表的基本的操作和函数实现。
以后必须自己动手编,实
现理论与实践相结合,提高自己的编程能力。
3•下一步的改进:
这个程序的交互性不强,可以改进的地方应该是可以从外部输入数组而不仅仅是编程者给定。
此外,显示的界面不够友好,有待改善,而且可以增加完善的报错机制。
此外,也希望
老师能在课上给出更多的优化指导。
代码
#include"
iostream"
usingnamespacestd;
template<
classT>
structNode
{
Tdata;
structNode*next;
};
template<
classLinkList{
public:
LinkList()//无参构造
front=newNode<
front->
next=NULL;
LinkList(Ta[],intn);
〃头插法
//LinkList(Ta[],intn);
〃尾插法voidPrintList();
〃按次序遍历intGetLength();
〃获取线性表的长度
*Get(inti);
〃获取第i个位置上的元素结点的地址intLocate(Tx);
〃查找voidInsert(inti,Tx);
〃插入
TDelete(inti);
//删除
~LinkList();
〃销毁
private:
*front;
};
LinkList<
:
LinkList(Ta[],intn)//头插法
for(inti=n-1;
i>
=0;
i--)
*s=newNode<
〃建立新结点s->
data=a[i];
〃给新结点数据域赋值s->
next=front->
//修改新结点的指针域
next=s;
〃修改头指针的指针域
}/*
LinkList(Ta[],intn)//尾插法{
front=newNode<
*r=front;
for(inti=0;
i<
n;
i++)
s_>
data=a[i];
r=s;
next=NULL;
}*/
voidLinkList<
PrintList()
*p=front;
-p=p_>
while(p->
next!
=NULL){
p=p_>
cout<
data<
endl;
intLinkList<
GetLength()
intn=0;
next!
=NULL){p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 线性