数据结构——5.线性表

第一部分:核心概念(笔试重点)

这部分是基础,笔试中经常以选择题、填空题和简答题的形式考察。

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
### 使用线性表实现图书信息系统的设计 #### 链式存储结构下的图书信息管理 为了构建基于链式存储结构的图书信息管理系统,可以采用如下方式来定义节点类 `BookNode` 和链表类 `BookList`: ```python class BookNode: def __init__(self, isbn="", title="", price=0.0): self.isbn = isbn # ISBN编号 self.title = title # 图书名称 self.price = price # 定价 self.next = None # 下一节点指针 class BookList: def __init__(self): self.head = None # 初始化头结点为空 def append(self, book_info): # 尾部插入新书籍记录 new_node = BookNode(*book_info) if not self.head: # 如果当前列表为空,则设置新的头部 self.head = new_node else: # 否则遍历到尾端再连接上新节点 current = self.head while current.next: current = current.next current.next = new_node def display_books(self): # 输出所有书籍的信息 books_data = [] temp = self.head while temp is not None: books_data.append((temp.isbn, temp.title, temp.price)) temp = temp.next return books_data ``` 上述代码展示了如何通过Python语言中的类和方法来模拟实际操作过程[^1]。 对于给定的一系列初始数据集,在创建实例化对象之后就可以调用相应的方法来进行处理了。例如初始化一批图书数据并打印出来查看效果: ```python if __name__ == "__main__": my_library = BookList() initial_book_list = [ ("9787302257646", "程序设计基础", 25), ("9787302219972", "单片机技术及应用", 32), ("9787302203513", "编译原理", 46) ] for item in initial_book_list: my_library.append(item) print(my_library.display_books()) ``` 这段脚本会依次向名为`my_library`的对象中添加三本书籍,并最终显示这些书籍的具体详情[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱看烟花的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值