实验一链式结构实现线性表.docx
- 文档编号:24142400
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:15
- 大小:128.81KB
实验一链式结构实现线性表.docx
《实验一链式结构实现线性表.docx》由会员分享,可在线阅读,更多相关《实验一链式结构实现线性表.docx(15页珍藏版)》请在冰豆网上搜索。
实验一链式结构实现线性表
数据结构实验报告
实验名称:
实验一——链式结构实现线性表
学生姓名:
班级:
班内序号:
学号:
日期:
1.实验要求
实验目的:
通过选择下面四个题目之一进行实现,掌握如下内容:
Ø熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法
Ø学习指针、模板类、异常处理的使用
Ø掌握线性表的操作的实现方法
Ø学习使用线性表解决实际问题的能力
实验内容:
根据线性表的抽象数据类型的定义,选择下面任一种链式结构实现线性表,并完成线性表的基本功能。
线性表存储结构(五选一):
1、带头结点的单链表
2、不带头结点的单链表
3、循环链表
4、双链表
5、静态链表
线性表的基本功能:
●构造:
使用头插法、尾插法两种方法
1、插入:
要求建立的链表按照关键字从小到大有序
2、删除
3、查找
4、获取链表长度
5、销毁
6、其他:
可自行定义
编写测试main()函数测试线性表的正确性。
2.程序分析
2.1存储结构
存储结构:
顺序表
2.2关键算法分析
头插法示意图:
算法步骤:
1堆中建立新结点
2S->next指向front->next
3front->next指向s
Node
s->data=a[i];
s->next=front->next;
front->next=s;
时间复杂度:
O(n)
尾插法
算法步骤:
1堆中建立新结点Node
2将新结点加入到链表中r->next=front->next
3修改尾指针r=s
按值查找结点示意图:
定位计数和定位指针
inti=1;
Node
p=front->next;
比较P指向的元素是否与检索值相同
if(p)
while(p)
{
if(p->data==n)
cout<<"元素序号:
"<
p=p->next;
i++;
}
else
throw"空链表!
";
时间复杂度:
O(n)
插入操作:
算法步骤:
1堆中建立新结点Node
2将新结点插入到要插入位置后一节点p的后面,将后一结点数据写入s
3P指向s,在p中写入新的值
s->data=p->data;
s->next=p->next;
p->next=s;
p->data=x;
时间复杂度:
O
(1)
删除结点示意图:
删除结点示意图
算法步骤:
①从第一个结点开始,查找第i-1个元素,设为p指向该结点;
②设q指向第i个元素:
q=p->next;
③摘链,即将q元素从链表中摘除:
p->next=q->next;
④保存q元素的数据:
x=q->data;
⑤释放q元素:
deleteq;
说明:
如果算法比较复杂,可以将多句代码合成一个步骤进行说明。
比如也可以这样写:
①从第一个结点开始,查找第i-1个元素,设为p指向该结点;
②设q指向第i个元素:
q=p->next;
③摘链,即将q元素从链表中摘除:
p->next=q->next;
x=q->data
deleteq;
时间复杂度:
O(n)
2.3其他
程序代码:
#include
usingnamespacestd;
template
structNode
{
Tdata;
structNode
};
template
classLinkList
{
public:
LinkList(){front=newNode
LinkList(Ta[],intn);
~LinkList();
Node
Node
voidInsert(inti,Tx);
TDelete(inti);
intGetLength();
voidPrint();
private:
Node
};
template
LinkList
:
LinkList(Ta[],intn)//头插法
{
front=newNode
front->next=NULL;
for(inti=n-1;i>=0;i--)
{
Node
s->data=a[i];
s->next=front->next;
front->next=s;
}
}
/*template
LinkList
:
LinkList(Ta[],intn)//尾插法
{
front=newNode
Node
for(inti=0;i { Node s->data=a[i]; r->next=s; r=s; } r->next=NULL; }*/ template LinkList : ~LinkList()//析构函数 { Node while(p) { front=p; p=p->next; deletefront; } } template Node : Get(inti) { Node intj=1; while(p&&j! =i) { p=p->next; j++; } returnp; } template Node : Locate(intn,Node { inti=1; Node p=front->next; if(p) while(p) { if(p->data==n) cout<<"元素序号: "< p=p->next; i++; } else throw"空链表! "; /*while(p&&p->data! =n) { p=p->next; } returnp; t=0; if(p->next)// Locate(n,p->next); else returnNULL;*/ } template voidLinkList : Insert(inti,Tx) { Node if(p) {Node s->data=p->data;// s->next=p->next; p->next=s; p->data=x; } else throw"输入有误"; } template TLinkList : Delete(inti) { Node if(i! =1) p=Get(i-1); Node p->next=q->next; Tx=q->data; deleteq; returnx; } template intLinkList : GetLength() { inti=0; Node if(p) { i++; p=p->next; } returni; } template voidLinkList : Print() { Node if(front->next) { while(p) { cout< p=p->next; } cout< } else throw"该表没有元素"; } voidmain() { intx,y; inta[6]={1,2,3,4,5,6}; LinkList L.Print(); cout<<"请输入要插入的位置和数值: "; cin>>x>>y; L.Insert(x,y); L.Print(); cout<<"请输入要删除的元素序号: "; cin>>x; L.Delete(x); L.Print(); cout<<"请输入需要查找的元素序号: "; cin>>x; cout< cout<<"请输入需要查找的元素: "; cin>>x; L.Locate(x,NULL); cout< 3.程序运行结果 测试主函数流程: 流程图如图所示 打印修改后序列 输入删除的位置 打印修改后序列 输入查找的关键值 打印查找关键值的位置 1、测试条件: 初始序列为123456 插入位置1数值6 是删除元素序号3 查找元素序号2 查找元素6 2、测试结论 初始序列为123456 插入位置1数值6后序列: 6123456 是删除元素序号3后序列: 613456 查找元素序号2后查找到序号2所对应元素为: 1 查找元素6查找到所对应元素序号为1和6 4.总结 本次实验我掌握了线性表的操作的实现方法,实现了线性表的基本功能: 使用头插法、尾插法两种方法构造了线性表,成功的插入了元素到指定位置,删除了指定元素,分别进行了按关键值查找和按序号查找,最后计算了链表的长度。 在程序调试过程中,主要的问题是总会有丢分号之类的小错误,整体来说,本次实验较为顺利。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 链式 结构 实现 线性