1 线性表的定义与基本概念
1.1 定义
线性表是由n(n ≥ 0)个具有相同数据类型的元素组成的有限有序序列,通常表示为:a1,a2,…,ana_1, a_2, \dots, a_na1,a2,…,an。
- 当n=0n=0n=0时,称为空表。
- 线性表中的元素按照逻辑顺序排列,每个元素有唯一的前驱和后继(除首元素无前驱,尾元素无后继)。
1.2 相关术语
- 前驱:元素aia_iai的前驱是ai−1a_{i-1}ai−1(若i=1i=1i=1,则无前驱)。
- 后继:元素aia_iai的后继是ai+1a_{i+1}ai+1(若i=ni=ni=n,则无后继)。
- 表头:线性表的第一个元素a1a_1a1。
- 表尾:线性表的最后一个元素ana_nan。
- 长度:线性表中元素的个数nnn。
- 空表:长度为0的线性表。
1.3 特点
- 有限性:元素个数有限。
- 顺序性:元素之间存在逻辑上的先后顺序。
- 同构性:所有元素具有相同的数据类型。
2 线性表的存储结构及操作
线性表有两种主要存储方式:顺序存储和链式存储。以下分别介绍其实现及常见操作(增、删、改、查)。
2.1 顺序存储(顺序表)
顺序表使用连续的存储空间(如数组)存储线性表中的元素。元素在内存中物理地址连续,逻辑顺序与物理顺序一致。
2.1.1 特点
- 优点:支持随机访问,查找效率高(时间复杂度O(1)O(1)O(1))。
- 缺点:插入和删除操作需要移动大量元素,效率较低(时间复杂度O(n)O(n)O(n))。
- 适用场景:适合元素数量固定、频繁查找的场景。
2.1.2 数据结构
顺序表的结构包括:
- 存储数组
- 表长度
- 最大容量
Python 示例(顺序表实现):
class SeqList:
def __init__(self, max_size=100):
self.data = [None] * max_size # 存储数组
self.length = 0 # 当前长度
self.max_size = max_size # 最大容量
# 检查是否为空
def is_empty(self):
return self.length == 0
# 检查是否已满
def is_full(self):
return self.length >= self.max_size
# 获取元素
def get(self, index):
if index < 0 or index >= self.length:
raise IndexError("Index out of range")
return self.data[index]
# 插入元素
def insert(self, index, value):
if self.is_full():
raise OverflowError("List is full")
if index < 0 or index > self.length:
raise IndexError("Index out of range")
# 后移元素
for i in range(self.length, index, -1):
self.data[i] = self.data[i-1]
self.data[index] = value
self.length += 1
# 删除元素
def delete(self, index):
if self.is_empty():
raise IndexError("List is empty")
if index < 0 or index >= self.length:
raise IndexError("Index out of range")
# 前移元素
for i in range(index, self.length-1):
self.data[i] = self.data[i+1]
self.length -= 1
# 修改元素
def update(self, index, value):
if index < 0 or index >= self.length:
raise IndexError("Index out of range")
self.data[index] = value
C++ 示例(顺序表实现):
#include <stdexcept>
class SeqList {
private:
static const int MAX_SIZE = 100; // 最大容量
int data[MAX_SIZE]; // 存储数组
int length; // 当前长度
public:
SeqList() : length(0) {
} // 构造函数
// 检查是否为空
bool isEmpty() const {
return length == 0;
}
// 检查是否已满
bool isFull() const {
return length >= MAX_SIZE;
}
// 获取元素
int get(int index) const {
if (index < 0 || index >= length) {
throw std::out_of_range("Index out of range");
}
return data[index];
}
// 插入元素
void insert(int index, int value) {
if (isFull()) {
throw std::overflow_error("List is full");
}
if (index < 0 || index > length) {
throw std::out_of_range("Index out of range");
}
// 后移元素
for (int i = length; i > index; --i) {
data[i] = data[i-1];
}
data[index] = value;
++length;
}
// 删除元素
void remove(int index) {
if (isEmpty()) {
throw std::out_of_range("List is empty");
}
if (index < 0 || index >= length) {
throw std::out_of_range("Index out of range");
}
// 前移元素
for (int i = index; i < length-1; ++i) {
data[i] = data[i+1];
}
--length;
}
// 修改元素
void update(int index, int value) {
if (index < 0 || index >= length) {
throw std

最低0.47元/天 解锁文章
1340

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



