定义线性表的逻辑关系与抽象操作,比较顺序表和链表的存储特征、复杂度与适用条件,建立后续实现的统一接口。

# 一、线性表的定义与抽象操作

线性表(Linear List)是具有相同数据类型的 nn 个数据元素的有限序列,其中 n≥0n\ge0。记作

L=(a1,a2,…,ai,ai+1,…,an).L=(a_1,a_2,\ldots,a_i,a_{i+1},\ldots,a_n).

当 n=0n=0 时,称为空表。除首元素 a1a_1 外,每个元素有且仅有一个直接前驱;除尾元素 ana_n 外,每个元素有且仅有一个直接后继。这是线性表的逻辑关系,和存储地址是否相邻无关。

# 1. 线性表的基本操作

操作语义
InitList初始化为空表
DestroyList销毁表并释放其占用的资源
ListInsert(L, i, e)在第 ii 个位置插入元素 ee
ListDelete(L, i, e)删除第 ii 个位置元素,并用 ee 返回其值
LocateElem按值或判定条件查找元素位置
GetElem取得第 ii 个位置的元素
Length返回表长
Empty判断是否为空
ClearList清空所有数据元素
ListTraverse依次访问每个元素

逻辑位置通常从 11 开始编号;C 数组下标通常从 00 开始编号。实现时必须明确约定,最常见的错误正是把两种编号混用。

# 2. 顺序表与链表

1
2
3
4
5
6
7
flowchart TB
A[线性表 L] --> B[顺序存储:顺序表]
A --> C[链式存储:链表]
B --> B1[元素占用连续存储单元]
B --> B2[可由首地址和下标直接定位]
C --> C1[结点地址可不连续]
C --> C2[通过指针或游标维持前驱后继关系]

对比项顺序表链表
元素地址连续可不连续
按位查找第 ii 个元素O(1)O(1)O(n)O(n)
已知前驱结点后的插入或删除通常仍需移动元素O(1)O(1)
按值查找O(n)O(n)O(n)O(n)
空间开销可能预留未使用容量每个结点需附加指针或游标
缓存局部性通常较好通常较差

“链表插入、删除都是 O(1)O(1)” 缺少前提。若只给出逻辑位置 ii,必须先遍历到第 i−1i-1 个结点,总代价仍为 O(n)O(n)。只有已经得到相关结点或其前驱指针时,改链操作才是 O(1)O(1)。

更新于 阅读次数 次

请我喝[茶]~( ̄▽ ̄)~*

梦前辈 微信支付

微信支付

梦前辈 支付宝

支付宝