数据结构与算法之顺序表 (C/C++实现)

顺序表 (C/C++实现)

顺序表和数组对比

  • 数组: 长度初始化后就不能更改
  • 顺序表: 可以随便增删改查, 数组的增强版, 对数组进一步封装,

顺序表原理

  • 顺序表是简单的一种线性结构
  • 数据存储位置跟数组一样都是相邻的
  • 顺序表中间不能有空值
  • 插入, 删除需要移动大量元素

顺序表三个要素:

  • 用 elems 记录存储数据位置的基地址
  • 分配一段连续的存储空间 size
  • 用 length 记录实际存储的元素个数, 既顺序表的长度

顺序表代码实现

顺序表结构实现

#define MAX_SIZE 100	// size 顺序表总空间长度
// 结构体实现顺序表结构
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;
}

### 顺序表删除元素的不足:
- 如果顺序表成员有成千上万, 删除最后一个元素还好点,直接就删除了
- 如果最坏,每次要删除第一个元素,这样每删除一个元素就需要所有元素循环进行移动,重复劳动, 这样大大消耗硬件资源的浪费, 再好的硬件也不能这么干
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值