Lecture 3:线性表的定义与基本操作
Chinese-language Computer Science 408 note: Lecture 3:线性表的定义与基本操作. Original source available where applicable.
On this page
This note is currently available in Chinese. The original wording, formulas and diagrams are preserved to avoid an unverified technical translation.
3.1 线性表的基本概念
3.1.1 线性表的特点
核心特点
- 线性表是最基本、最常见的一种线性结构。
- 它强调的是元素之间存在“一对一”的前后关系。
五个特点
-
- 表中元素个数有限;
-
- 表中元素具有逻辑上的顺序性,元素之间有先后次序;
-
- 表中元素都是数据元素,每个元素都是单个元素;
-
- 表中元素的数据类型相同;在教材的定长元素、顺序存储模型中,每个存储单元占用相同大小的空间;
-
- 表中元素具有抽象性,只讨论元素之间的逻辑关系,不讨论元素具体表示什么内容。
解释
- “有限”说明线性表不是无限序列。
- “有序”说明每个元素在表中有确定位置。
- “类型相同”规定了线性表的元素类型;顺序表要按地址公式快速定位,还需元素在存储中等长且连续。对于变长编码或指针所指向的变长对象,不能只凭“同类型”推出实际数据都占相同字节数。
- “抽象性”说明线性表只关心结构关系,不关心元素是学生、数字还是字符。
3.1.2 线性表的定义
定义:#线性表
描述: 线性表是具有相同数据类型的 $n(n\ge 0)$ 个数据元素的有限序列,其中 $n$ 为表长。当 $n=0$ 时,线性表是空表。
一般表示 $$ L=(a_1,a_2,\cdots,a_i,a_{i+1},\cdots,a_n) $$
解释
- $L$:线性表的名称。
- $a_i$:线性表中的第 $i$ 个元素。
- $n$:线性表的长度,也叫表长。
- 当 $n=0$ 时: $$ L=() $$ 此时称为空表。
表头和表尾
- $a_1$ 是表头元素。
- $a_n$ 是表尾元素。
前驱和后继
- 除第一个元素外,每个元素有且仅有一个直接前驱。
- 除最后一个元素外,每个元素有且仅有一个直接后继。
注意
- 线性表中的位序从 1 开始。
- 数组下标通常从 0 开始。
- 因此第 $i$ 个元素在线性表中的位序是 $i$,但如果用数组实现,它常常存放在下标 $i-1$ 的位置。
例子
- 线性表: $$ L=(10,20,30,40) $$
- 表长: $$ n=4 $$
- 第 1 个元素是 $10$。
- 第 3 个元素是 $30$。
- 第 3 个元素若用数组保存,通常对应数组下标 $2$。
3.2 线性表的基本操作
核心
- 线性表的基本操作是后续顺序表、链表代码题的基础。
- 考试中经常通过这些操作来考查:
- 参数含义;
- 位序合法性;
- 插入删除边界;
- 时间复杂度。
3.2.1 初始化
定义:#InitList
描述:
InitList(&L)用于把线性表 $L$ 初始化为空表,并建立实现所需的初始状态;是否分配内存取决于具体存储实现。
解释
&L表示需要修改线性表本身。- 初始化后,线性表通常处于空表状态。
- 静态顺序表通常只需把表长设为 0;动态顺序表或带头结点链表才需要在初始化时申请相应空间。
3.2.2 销毁
定义:#DestroyList
描述:
DestroyList(&L)用于销毁线性表,并释放线性表 $L$ 所占用的内存空间。
解释
- 销毁操作不仅是清空元素,还要释放占用空间。
- 对动态分配的线性表尤其重要。
3.2.3 插入
定义:#ListInsert
描述:
ListInsert(&L, i, e)表示在表 $L$ 中第 $i$ 个位置插入指定元素 $e$。
解释
- 插入位置 $i$ 是线性表位序,不是数组下标。
- 从逻辑上看,插入后原第 $i$ 个元素及其后续元素的位序依次加 1;顺序表实现通常要将这些元素在数组中后移,链表在定位插入位置后主要调整链接,不必整体搬移后续元素。
- 合法插入位置通常为: $$ 1\le i\le L.length+1 $$
- 当 $i=L.length+1$ 时,表示在表尾插入。
3.2.4 删除
定义:#ListDelete
描述:
ListDelete(&L, i, &e)表示删除表 $L$ 中第 $i$ 个位置的元素,并用 $e$ 返回被删除元素的值。
解释
&e的作用是把删除的元素“带回来”。- 删除位置 $i$ 必须是已有元素的位置。
- 合法删除位置通常为: $$ 1\le i\le L.length $$
3.2.5 按值查找
定义:#LocateElem
描述:
LocateElem(L, e)表示在表 $L$ 中查找具有给定关键字值 $e$ 的元素。
解释
- 这是按“元素值”查找。
- 查找结果通常是元素位序或元素位置。
- 如果表中不存在该元素,则返回失败标志。
3.2.6 按位查找
定义:#GetElem
描述:
GetElem(L, i)表示获取表 $L$ 中第 $i$ 个位置的元素值。
解释
- 这是按“位序”查找。
- 位序 $i$ 从 1 开始。
- 若顺序表支持随机访问,按位查找可以很快。
3.3 线性表的其他常用操作
常用操作表
| 操作 | 含义 | 说明 |
|---|---|---|
Length(L) |
求表长 | 返回线性表 $L$ 中数据元素的个数 |
PrintList(L) |
输出操作 | 按前后顺序输出线性表 $L$ 的所有元素值 |
Empty(L) |
判空操作 | 若 $L$ 为空表,则返回 true,否则返回 false |
解释
Length(L)关注表中有多少个元素。PrintList(L)关注按逻辑顺序输出所有元素。Empty(L)关注线性表当前是否为空。
3.4 操作分类总结
按功能分类
| 类型 | 操作 | 作用 |
|---|---|---|
| 创建/销毁 | InitList、DestroyList |
管理线性表生命周期 |
| 增删 | ListInsert、ListDelete |
改变线性表内容和长度 |
| 查找 | LocateElem、GetElem |
获取元素位置或元素值 |
| 辅助 | Length、PrintList、Empty |
获取状态或输出内容 |
按是否修改线性表分类
- 会修改线性表:
InitList(&L);DestroyList(&L);ListInsert(&L,i,e);ListDelete(&L,i,&e)。
- 不一定修改线性表:
LocateElem(L,e);GetElem(L,i);Length(L);PrintList(L);Empty(L)。
相关知识
- 科目导航:数据结构导航
- 阅读顺序:上一篇:算法和算法评价 · 下一篇:线性表的顺序实现
- 关联专题:顺序表代码
3.5 本节复盘
必须掌握
- 线性表的定义: $$ L=(a_1,a_2,\cdots,a_i,a_{i+1},\cdots,a_n) $$
- 表长 $n$ 可以为 0。
- $n=0$ 时,线性表是空表。
- 第一个元素是表头元素,最后一个元素是表尾元素。
- 除第一个元素外,每个元素有且仅有一个直接前驱。
- 除最后一个元素外,每个元素有且仅有一个直接后继。
易错点
- 位序从 1 开始,数组下标从 0 开始。
- 插入位置可以是 $L.length+1$,表示表尾插入。
- 删除位置不能是 $L.length+1$,因为这个位置没有已有元素。
ListDelete(&L,i,&e)中的e用来返回被删除元素。
做题抓手
- 看到
i,先判断它是位序还是数组下标。 - 看到插入,检查:
- $1\le i\le L.length+1$;
- 表是否已满。
- 看到删除,检查:
- $1\le i\le L.length$;
- 是否需要返回删除值。