Skip to content

2.2 线性表的抽象数据类型

把"一行字符"推广一下:不限于字符,任何n个同类型元素排成一个序列,相邻元素之间是一对一的前后关系,这样的结构叫线性表,记作 (a₀, a₁, …, aₙ₋₁)。n叫线性表的长度,n=0时是空表。a₀前面没有元素,aₙ₋₁后面没有元素,其余每个元素都恰好有一个前驱和一个后继。本书约定位置从0开始编号,与C语言数组一致。

线性表上最基础的操作有六个:

操作含义前提
Init(L)建立一个空表
Length(L)返回表的长度n
Get(L, i)返回第i个元素0 ≤ i < n
Insert(L, i, x)在第i个位置插入x,原来第i个及之后的元素依次后移0 ≤ i ≤ n
Delete(L, i)删除第i个元素,之后的元素依次前移0 ≤ i < n
Locate(L, x)返回x第一次出现的位置,不存在返回−1

注意Insert允许i=n,表示在末尾追加;Delete不允许。表满不满、位置越界怎么办,是实现层面的事,这里只规定合法的前提。

这六个操作加上线性关系,就是线性表的抽象数据类型。它没有提到光标,也没有提到字符——线性表是通用的,编辑器只是它的一个应用。编辑器可以看成"一个元素类型为字符的线性表,外加一个整数记录光标位置":敲字符是Insert(L, cursor, c)然后cursor加一;退格是Delete(L, cursor−1)然后cursor减一;左右方向键只改cursor;显示就是从0到Length(L)−1逐个Get。

到这里,编辑器的问题已经完全转化为线性表的问题。剩下的事是把线性表在计算机里实现出来。第1章介绍了两种存储手段,我们先用顺序存储。