第一部分:核心概念(笔试重点)
这部分是基础,笔试中经常以选择题、填空题和简答题的形式考察。
1. 什么是线性表?
- 定义:线性表是由 零个或多个 具有 相同类型 的数据元素组成的 有序集合。
- 关键点:
- 相同类型:意味着不能在一个线性表里同时存整数和字符串(在某些语言的实现中可以,但从数据结构定义上是要求类型一致的)。
- 有序集合:元素之间有明确的前后次序关系。
- 数学表示:
L = (a₁, a₂, a₃, ..., aᵢ, ..., aₙ)a₁是 表头,aₙ是 表尾。- 当
n=0时,称为 空表。 - 除了表头和表尾,每个元素都有一个 唯一的前驱 和一个 唯一的后继。这是线性表最核心的逻辑特性。
2. 线性表的基本操作
无论线性表如何存储,它都应该支持以下基本操作:
- 创建与销毁:初始化一个表或释放表的空间。
- 增:在指定位置插入一个新元素。
- 删:删除指定位置的元素。
- 改:修改指定位置的元素值。
- 查:
- 按位置查找(存取):获取第
k个元素的值。 - 按值查找:寻找某个特定值的元素在表中的位置。
- 按位置查找(存取):获取第
- 其他:获取表长、判断表是否为空等。
第二部分:线性表的两种物理实现(笔试与机试核心)
这是整个章节的重中之重,你需要深刻理解两种存储方式的原理、优缺点和代码实现。
(一) 顺序表 (Sequential List)
1. 核心思想
- 定义:用一段 地址连续 的存储单元依次存储线性表的数据元素。
- 物理载体:在C++/Java等语言中,通常用 数组 来实现。
- 记忆技巧:把顺序表想象成一列火车,每节车厢(数组元素)紧挨着,车厢有编号(数组下标),可以根据编号瞬间找到任何一节车厢。
2. 结构定义 (C/C++)
#define MAX_SIZE 100 // 静态分配时预定义最大容量
typedef struct {
int* data; // 动态分配的数组指针
int length; // 当前长度
int maxSize; // 数组最大容量
} SeqList;
// 或者使用C++的vector,这是机试的首选!
// #include <vector>
// std::vector<int> list;
3. 操作与时间复杂度分析(笔试高频考点)
| 操作类型 | 实现逻辑 | 时间复杂度 | 关键原因 |
|---|---|---|---|
| 按位置存取 (Get) | 直接通过数组下标 data[k] 访问 |
O(1)O(1)O(1) | 内存地址可以通过公式 基地址 + k * sizeof(元素) 直接算出,无需遍历。 |
| 插入 (Insert) | 1. 找到插入位置 k。2. 将从 k 到结尾的所有元素向后移动一位。3. 在 k 处放入新元素。4. 表长 length 加1。 |
O(n)O(n)O(n) | 平均需要移动 n/2 个元素。最坏情况(插在表头)移动 n 个元素。 主要开销是移动元素。 |
| 删除 (Delete) | 1. 找到删除位置 k。2. 将从 k+1 到结尾的所有元素向前移动一位。3. 表长 length 减1。 |
O(n)O(n)O(n) | 平均需要移动 (n-1)/2 个元素。最坏情况(删除表头)移动 n-1 个元素。 主要开销是移动元素。 |
| 按值查找 (Search) | 从头到尾遍历数组,逐个比较 | O(n)O(n)O(n) | 最坏情况需要遍历整个表。 |
4. C++代码实现(机试基础)
如果考试要求必须手写顺序表,你需要掌握以下代码。
#include <iostream>
typedef struct {
int* data;
int length;
int maxSize;
} SeqList;
// 初始化
void init(SeqList& L, int size) {
L.data = new int[size];
L.length = 0;
L.maxSize = size;
}
// 在位置i插入元素e (i是逻辑位置,从1开始)
bool insert(SeqList& L, int i, int e) {
// 检查位置是否合法及空间是否已满
if (i < 1 || i > L.length + 1 || L.length >= L.maxSize) {
return false;
}
// 将元素后移
for (int j = L.length; j >= i; --j) {
L.data[j] = L.data[j - 1];
}
// 插入元素
L.data[i - 1] = e;
L.length++;
return true;
}
// 删除位置i的元素 (i是逻辑位置,从1开始)
bool remov

最低0.47元/天 解锁文章
578

被折叠的 条评论
为什么被折叠?



