详解数据结构之C++实现线性表Word文件下载.docx
- 文档编号:19588081
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:23
- 大小:260.70KB
详解数据结构之C++实现线性表Word文件下载.docx
《详解数据结构之C++实现线性表Word文件下载.docx》由会员分享,可在线阅读,更多相关《详解数据结构之C++实现线性表Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
ListInsert(*L,i,e):
在线性表的第i个位置插入元素e。
ListDelete(*L,i,*e):
删除线性表L中的第i个元素,并用e返回其值
ListLength(L):
返回线性表L的元素个数。
PrintList(L):
打印线性表
对于不同的应用,线性表的基本操作是不同的,上述操作是最基本的。
对于实际问题中涉及的关于线性表的更复杂操作,完全可以用这些基本操作的组合来实现。
三、线性表的顺序存储
1.顺序存储定义
顺序表,一般使用数组实现,事实上就是在内存中找个初始地址,然后通过占位的形式,把一定连续的内存空间给占了,然后把相同数据类型的数据元素依次放在这块空地中,数组大小有两种方式指定,一是静态分配,二是动态扩展。
顺序表相关的操作跟数组有关,一般都是移动数组元素。
2.顺序存储的实现方式
结构
我们直接来看顺序表的模板类的代码:
constintMaxSize=100;
template<
classDataType>
classSeqList
{
public:
SeqList(){length=0;
}//无参数构造方法
SeqList(DataTypea[],intn);
//有参数构造方法
~SeqList(){}//析构函数
intLength(){returnlength;
}//线性表长度
DataTypeGet(inti);
//按位查找
intLocate(DataTypex);
//按值查找
voidInsert(inti,DataTypex);
//插入
DataTypeDelete(inti);
//删除
voidPrintList();
//遍历
private:
DataTypedata[MaxSize];
//顺序表使用数组实现
intlength;
//存储顺序表的长度
};
顺序表的封装需要三个属性:
存储空间的起始位置。
数组data的存储位置就是线性表存储空间的存储位置
线性表的最大存储容量。
数组长度MAXSIZE
线性表的当前长度。
length
注意:
数组的长度与线性表的当前长度是不一样的。
数组的长度是存放线性表的存储空间的总长度,一般初始化后不变。
而线性表的当前长度是线性表中元素的个数,是会改变的。
下面我们将实现顺序表的各个功能:
有参数构造:
创建一个长度为n的顺序表,需要将给定的数组元素作为线性表的数据元素传入顺序表中,并将传入的元素个数作为顺序表的长度
SeqList<
DataType>
:
SeqList(DataTypea[],intn)
if(n>
MaxSize)throw"
wrongparameter"
;
for(inti=0;
i<
n;
i++)
data[i]=a[i];
length=n;
}
按位查找
按位查找的时间复杂度为O
(1)O
(1)。
DataTypeSeqList<
Get(inti)
if(i<
1&
&
i>
length)throw"
wrongLocation"
elsereturndata[i-1];
按值查找
按值查找,需要对顺序表中的元素依次进行比较。
intSeqList<
Locate(DataTypex)
length;
if(data[i]==x)returni+1;
return0;
插入
插入的过程中需要注意元素移动的方向,必须从最后一个元素开始移动,如果表满了,则引发上溢;
如果插入位置不合理,则引发位置异常。
voidSeqList<
Insert(inti,DataTypex)
if(length>
=MaxSize)throw"
Overflow"
1||i>
length+1)throw"
Location"
for(intj=length;
j>
=i;
j--)
data[j]=data[j-1];
data[i-1]=x;
length++;
删除
注意算法中元素移动方向,移动元素之前必须取出被删的元素,如果表为空则发生下溢,如果删除位置不合理,则引发删除位置异常。
·
Delete(inti)
intx;
if(length==0)throw"
Underflow"
x=data[i-1];
for(intj=i;
j<
j++)
data[j-1]=data[j];
length--;
returnx;
遍历
按下标依次输出各元素
PrintList()
cout<
<
data[i]<
endl;
完整代码示例(更多数据结构完整示例可见GitHub):
#include<
iostream>
usingnamespacestd;
~SeqList(){}
intmain()
int>
p;
p.Insert(1,5);
p.Insert(2,9);
p.PrintList();
p.Insert(2,3);
p.Length()<
p.Get(3)<
p.Delete
(2);
3.顺序存储的优缺点
优点:
随机访问特性,查找O
(1)时间,存储密度高;
逻辑上相邻的元素,物理上也相邻;
无须为表中元素之间的逻辑关系而增加额外的存储空间;
缺点:
插入和删除需移动大量元素;
当线性表长度变化较大时,难以确定存储空间的容量;
造成存储空间的“碎片”
四、线性表的链式存储
1.链式存储定义
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。
这就意味着,这些元素可以存在内存未被占用的任意位置。
链表的定义是递归的,它或者为空null,或者指向另一个节点node的引用,这个节点含有下一个节点或链表的引用,线性链表的最后一个结点指针为“空”(通常用NULL或“^”符号表示)。
2.链式存储的实现方式
存储方法
template<
structNode
DataTypedata;
//存储数据
Node<
*next;
//存储下一个结点的地址
结点由存放数据元素的数据域和存放后继结点地址的指针域组成。
单链表的模板类的代码:
classLinkList
LinkList();
LinkList(DataTypea[],intn);
~LinkList();
intLength();
voidInsert(inti,DataTypex);
*first;
特点:
用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置
顺序存储结构每个数据元素只需要存储一个位置就可以了,而链式存储结构中,除了要存储数据信息外,还要存储它的后继元素的存储地址
无参数构造
生成只有头结点的空链表
LinkList<
LinkList()
first=newNode<
first->
next=NULL;
头插法构造单链表
头插法是每次将新申请的结点插在头结点后面
LinkList(DataTypea[],intn)
for(inti=0;
i<
n;
i++)
*s=newNode<
s->
data=a[i];
next=first->
next;
next=s;
尾插法构造单链表
尾插法就是每次将新申请的结点插在终端节点的后面
*r=first;
r->
r=s;
析构函数
单链表类中的结点是用new申请的,在释放的时候无法自动释放,所以,析构函数要将单链表中的结点空间释放
~LinkList()
while(first!
=NULL)
*q=first;
first=first->
deleteq;
计算长度
单链表中不能直接求出长度,所以我们只能将单链表扫描一遍,所以时间复杂度为O(n)O(n)
intLinkList<
Length()
*p=first->
intcount=0;
while(p!
p=p->
count++;
returncount;
单链表中即使知道节点位置也不能直接访问,需要从头指针开始逐个节点向下搜索,平均时间性能为O(n)O(n),单链表是顺序存取结构
DataTypeLinkList<
intcount=1;
=NULL&
count<
i)
if(p==NULL)throw"
elsereturnp->
data;
单链表中按值查找与顺序表中的实现方法类似,对链表中的元素依次进行比较,平均时间性能为O(n)O(n).
*p=first->
if(p->
data==x)returncount;
单链表在插入过程中需要注意分析在表头、表中间、表尾的三种情况,由于单链表带头结点,这三种情况的操作语句一致,不用特殊处理,时间复杂度为O(n)O(n)
voidLinkList<
Insert(inti,DataTypex)
*p=first;
i-1)
else{
data=x;
next=p->
p->
删除操作时需要注意表尾的特殊情况,此时虽然被删结点不存在,但其前驱结点却存在。
因此仅当被删结点的前驱结点存在且不是终端节点时,才能确定被删节点存在,时间复杂度为O(n)O(n).
if(p==NULL||p->
next==NULL)throw"
*q=p->
intx=q->
next=q->
遍历单链表时间复杂度为O(n)O(n).
cout<
p->
data<
endl;
p=p-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详解 数据结构 C+ 实现 线性