下面是一篇系统、实用的教程文章——《数据结构之顺序表》,适合用于学习笔记、教学讲解或技术博客发布。
📘 数据结构之顺序表(Sequential List)
🧩 一、什么是顺序表?
顺序表(Sequential List) 是一种最基础、最常用的线性表结构。
它使用 一组连续的存储单元(数组) 来依次存放线性表中的各个元素。
简单来说:
顺序表 = 数组 + 线性逻辑顺序
示意图:
下标: 0 1 2 3 4
数据: [10] [20] [30] [40] [50]
⚙️ 二、顺序表的特点
| 特性 | 描述 |
|---|---|
| 存储方式 | 连续存储(数组) |
| 逻辑顺序 = 物理顺序 | 方便随机访问 |
| 随机访问性能好 | O(1) 复杂度 |
| 插入删除代价高 | O(n) 复杂度(需移动元素) |
🧮 三、顺序表的两种实现方式
1. 静态顺序表
使用固定长度数组定义,如:
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int length;
} SqList;
特点:
- 简单易实现
- 长度固定,不能动态扩展
2. 动态顺序表
使用动态内存分配(malloc/new),可灵活扩容:
typedef struct {
int *data;
int length;
int capacity;
} SeqList;
🧰 四、顺序表的基本操作
1️⃣ 初始化
void InitList(SeqList *L, int initSize) {
L->data = (int *)malloc(sizeof(int) * initSize);
L->length = 0;
L->capacity = initSize;
}
2️⃣ 插入元素
在第 pos 个位置插入 x:
void InsertList(SeqList *L, int pos, int x) {
if (pos < 0 || pos > L->length) return;
if (L->length >= L->capacity) return; // 需扩容机制
for (int i = L->length; i > pos; i--)
L->data[i] = L->data[i - 1];
L->data[pos] = x;
L->length++;
}
3️⃣ 删除元素
删除位置 pos 的元素:
void DeleteList(SeqList *L, int pos) {
if (pos < 0 || pos >= L->length) return;
for (int i = pos; i < L->length - 1; i++)
L->data[i] = L->data[i + 1];
L->length--;
}
4️⃣ 查找元素
按值查找:
int LocateElem(SeqList *L, int x) {
for (int i = 0; i < L->length; i++)
if (L->data[i] == x) return i;
return -1;
}
⚡ 五、顺序表的复杂度分析
| 操作 | 时间复杂度 | 说明 |
|---|---|---|
| 访问(按下标) | O(1) | 随机访问快 |
| 查找(按值) | O(n) | 需遍历 |
| 插入 | O(n) | 可能移动大量元素 |
| 删除 | O(n) | 同上 |
| 空间复杂度 | O(n) | 连续空间 |
💡 六、顺序表与链表的比较
| 比较项 | 顺序表 | 链表 |
|---|---|---|
| 存储方式 | 连续存储 | 离散存储 |
| 查找性能 | O(1) 随机访问 | O(n) 线性查找 |
| 插入删除 | O(n) 移动元素 | O(1) 修改指针 |
| 空间利用率 | 固定/可扩展 | 动态分配 |
| 使用场景 | 数据量较小、随机访问频繁 | 插删频繁、空间不连续 |
🧠 七、实际应用场景
- 数组封装类(如 Python list、C++ vector)
- 顺序存储的数据缓存
- 矩阵或图的邻接矩阵表示
- 需要随机访问的算法(如二分查找)
发表回复