Sqlist
顺序表的类型定义:
顺序表的逻辑结构与物理结构相同,可用一维数组来表示,但是需要实现对表的增删改查,这会改变表的长度。
故定义类型Sqlist,其中包括一维数组elem、表示顺序表当前长度的整型变量length
|
在顺序表定义中使用动态分配的数组(类C)
|
顺序表基本操作的实现
线性表的基本操作:
InitList(&L) //初始化操作,建立一个空的线性表L |
通用算法中预定义了一些常量和类型作为函数结果状态的表示,如下:
|
InitList函数的实现-顺序表L的初始化
王卓课上的伪代码:
|
用C语言实现InitList函数:
|
DestroyList函数的实现-释放存储空间
王卓课上伪代码:
void DestroyList(SqList &L) |
C语言代码:
void DestroyList(SqList* L) |
ClearList函数的实现-清空线性表L
王卓课上伪代码:
void ClearList(Sqlist &L) |
C语言代码:
void ClearList(Sqlist *L) |
GetLength函数的实现-获取线性表的长度
王卓课上伪代码:
int GetLength(SqList L) //无需采用引用方式传参 |
C语言代码:
int GetLength(Sqlist* L) |
IsEmpty函数的实现-判断线性表是否为空
王卓课上伪代码:
int IsEmpty(SqList L) |
C语言代码:
int IsEmpty(SqList *L) |
GetElem函数的实现-获取位置为i的数据元素
王卓课上代码:
Status GetElem(Sqlist L, int i, ElemType &e) |
LocateElem函数的实现-顺序表的查找
该函数在线性表L中查找与给定值e相等的元素,若成功返回该元素在表中的序号,否则返回0
王卓课上伪代码:
int LocateElem(Sqlist L, ElemType e) |
int LocateElem(Sqlist *L, ElemType e) |
对顺序表查找算法的时间复杂度分析:
提出概念:平均查找长度ASL(Average Search length):
- 为确定记录在表中的位置,需要与给定值进行比较的关键字的个数的期望值叫做查找算法的平均查找长度
- 对于n个记录的表,查找成功时:
InsertElem函数的实现-顺序表的插入
顺序表的插入运算是指在表的第i(1<=i<=n+1)个位置上,插入一个新节点e,使长度为n的线性表变成长度为n+1的线性表,核心思路如下:
- 判断插入位置i是否合法
- 判断顺序表的存储空间是否已满,若满返回ERROR(OVERFOLW?)
- 将第n至第i位的元素依次向后移动一个位置,空出第i个位置
王卓课上伪代码如下:
Status ListInsert_Sq(Sqlist &L, int i, ElemType e) |
对顺序表插入算法的分析:
算法时间主要耗费在移动元素的操作上:
- 若插入在尾结点之后,则根本无需移动(特别快)
- 若插入在首结点之前,则表中元素全部后移(特别慢)
- 平均移动次数:
ListDelete函数的实现-顺序表删除
线性表的删除运算是指将表的第i个节点删除使长度为n的线性表变成长度为n - 1的线性表
算法思想:
- 判断删除位置i是否合法
- 将欲删除的元素保留在e中
- 将第i+1至第n位的元素依次向前移动一个位置
- 表长减1,删除成功返回OK
Status ListDelete_Sq(Sqlist &L, int i) |
算法时间主要耗费在移动元素的操作上:
- 若删除尾结点,则无需移动
- 若删除首结点,则表中n-1个元素全部前移
- 平均次数:
小结
顺序表的特点:
- 利用数据元素的存储位置表示线性表中相邻元素之间的前后关系,即线性表的逻辑结构和存储结构一致
- 在访问线性表时,可以快速地计算出任何一个数据元素地存储地址,因此可以粗略地认为,访问每个元素所花的时间相等
- 将2.所述的存取元素的方法称为随机存取法
时间复杂度:
顺序表查找、插入、删除算法的平均时间复杂度为O(n)
空间复杂度:
顺序表操作算法没有占用辅助空间,空间复杂度为O(1)
优缺点:
- 优点:
- 存储密度大
- 可以随机存取表中任一元素
- 缺点:
- 插入、删除某一元素时,需要移动大量元素
- 浪费存储空间
- 属于静态存储形式,数据元素的个数不能自由扩充
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 鼠鼠的藏宝洞!