顺序表 (C/C++实现)
顺序表和数组对比
- 数组: 长度初始化后就不能更改
- 顺序表: 可以随便增删改查, 数组的增强版, 对数组进一步封装,
顺序表原理
- 顺序表是简单的一种线性结构
- 数据存储位置跟数组一样都是相邻的
- 顺序表中间不能有空值
- 插入, 删除需要移动大量元素
顺序表三个要素:
- 用 elems 记录存储数据位置的基地址
- 分配一段连续的存储空间 size
- 用 length 记录实际存储的元素个数, 既顺序表的长度
顺序表代码实现
顺序表结构实现
#define MAX_SIZE 100
typedef struct {
int *elems;
int length;
int size;
}_SqList;
初始化顺序表
bool initList(_SqList &L)
{
L.elems = new int[MAX_COUNT];
if (!L.elems) return false;
L.length = 0;
L.size = MAX_COUNT;
return true;
}
追加数据
bool listAppend(_SqList &L, _Star &star)
{
if (L.length == L.size) return false;
L.elems[L.length] = star;
L.length++;
return true;
}
插入数据
bool listInsert(_SqList &L, int id, int e)
{
if (id<0 || id>=L.length) return false;
if (L.length == L.size) return false;
for (int i=L.length-1; i>=id; i--)
{
L.elems[i+1] = L.elems[i];
}
L.elems[id] = e;
L.length++;
return true;
}
删除数据
bool listDelete(_SqList &L, int id)
{
if (id<0 || id>=L.length) return false;
if (id == L.length-1)
{
L.length--;
return true;
}
for (int i=id; i<L.length; i++)
{
L.elems[i] = L.elems[i+1];
}
L.length--;
return true;
}
释放顺序表
- 顺序表使用动态内存, 结束使用需要释放它, 避免造成系统内存的浪费
void destroyList(_SqList &L)
{
if (L.elems) delete[] L.elems;
L.length = 0;
L.size = 0;
}
### 顺序表删除元素的不足:
- 如果顺序表成员有成千上万, 删除最后一个元素还好点,直接就删除了
- 如果最坏,每次要删除第一个元素,这样每删除一个元素就需要所有元素循环进行移动,重复劳动, 这样大大消耗硬件资源的浪费, 再好的硬件也不能这么干