第2章线性表

第2章线性表

2.1线性表的类型定义

1.数据结构课程体系定位:明确线性表的 “学科位置”

老师开篇先梳理课程整体框架,帮助学习者建立知识全局观,核心内容如下:

(1)课程四大板块划分

  • 板块 1:第一章《绪论》(基础铺垫,含数据结构基本术语、算法分析等);
  • 板块 2(核心板块):由第二章(线性表)、第三章(栈与队列)、第五章(树、二叉树)、第六章(图)构成,聚焦 “线性结构” 与 “非线性结构” 两大类逻辑结构;
  • 板块 3:第七章《查找》;
  • 板块 4:第八章《排序》(视频暂未展开)。

(2)核心板块(板块 2)的内部体系

  • 线性结构体系:由第二章(线性表)、第三章(栈与队列)组成。因线性结构类型繁多,采用 “列举法教学”—— 以 “最简单的线性表”“最常用的栈和队列” 三个典型类型,帮助掌握线性结构共性;
  • 非线性结构体系:由第五章(树、二叉树)、第六章(图)组成,是线性结构的 “多对一”“多对多” 延伸,需以线性结构为基础。

(3)线性表的核心定位与学习要点

  • 性质:线性结构中 “最简单” 的类型(栈与队列被定义为 “最常用”,二者不矛盾);
  • 易错点:“线性表是线性结构” 表述正确,但 “线性结构就是线性表” 错误(线性表是线性结构的子集,非全部);
  • 学习四要点:需掌握 “定义、描述、存储、操作(练习)”,其中 “操作” 以习题形式展开,“存储” 将在后续进阶内容中讲解。

2.线性结构的 “特点式定义”:兼具考点与判断依据

老师未直接给出线性结构的文字定义,而是通过 “四大特点” 反向界定,且明确这四大特点是 **“定义、特点、判断依据” 三位一体的考研高频考点 **:

线性结构可以是一个空集

(1) 线性结构的四大特点(非空有限集)

当线性结构为 “非空有限集” 时,需同时满足以下四个特点,且所有约束对象均为 “数据元素”(非数据项):

  1. 开始节点唯一:有且仅有 1 个 “开始节点”,该节点只有 “后继”(后续数据元素),无 “前驱”(前面的数据元素);
  2. 终端节点唯一:有且仅有 1 个 “终端节点”(结束节点),该节点只有 “前驱”,无 “后继”;
  3. 中间节点前驱唯一:除开始节点外,集合中每一个数据元素,有且仅有 1 个 “前驱”(即直接位于其前面的数据元素);
  4. 中间节点后继唯一:除终端节点外,集合中每一个数据元素,有且仅有 1 个 “后继”(即直接位于其后面的数据元素)。

综上,线性结构的定义逻辑为:“可空集,若为非空有限集则满足‘两节点唯一、两前驱后继唯一’”,且始终以 “数据元素” 为基本约束单位,这是区分线性结构与非线性结构的核心依据。

(2)线性结构的可视化与逻辑本质

  • 可视化表达:常用序列a₁→a₂→a₃→…→aₙ表示,箭头方向体现 “前驱→后继” 关系;
  • 逻辑本质:通过 “开始节点唯一、终端节点唯一、中间节点前驱后继唯一”,明确线性结构的 “一对一” 核心特征,这也是判断某结构是否为线性结构的核心依据(如链表符合该特征,属于线性结构)。

3.线性表的定义:学术表述与通俗理解

老师从 “数量、结构、属性” 三个维度,明确线性表的科学定义,覆盖考研答题与理解需求:

(1)学术定义

  • 线性表是由n个数据元素构成的 “有限序列”,其中n ≥ 0

    • n=0时:称为 “空表”;

    • n>0时:为非空表,元素需满足 “同类型、同结构”(均匀性)。

  • 线性表是一种最常用(最简单)的数据结构。含有n个数据元素的线性表是一个数据结构。

    • List = (D, R)

      其中D = {aᵢ|aᵢ ∈ ElemSet, i=1,2,…,n, n≥0}

      R =

特性:均匀性,有序性(线性序列关系)

  • 均匀性—— 所有数据元素需 “同类型、同结构”(如 “学生表” 中不可混入 “课程” 元素)。

(2)通俗表述(考研简答题适用)

  • 简化版:“线性表是最简单的线性结构”(最精准、常用);
  • 扩展版:“线性表是由同类型、同结构数据元素构成的线性结构”(补充 “均匀性”,避免误解)。

(3)关键术语辨析

  • 数据元素:线性表的基本构成单位(如 “学生表” 中的 “单个学生”);
  • 数据项:数据元素的组成部分(如 “学生” 的 “学号、姓名”)—— 线性表以 “数据元素” 为单位,而非 “数据项”。

4.线性表的描述:从 “数据 + 关系” 拆解逻辑结构

老师通过 “数据(data)” 与 “关系(relation)” 两部分,可视化线性表的逻辑结构,核心内容如下:

(1)构成要素:数据(data)

  • 基本单位:数据元素(非数据项);
  • 核心属性:均匀性—— 所有数据元素需 “同类型、同结构”(如 “学生表” 中不可混入 “课程” 元素)。

(2) 构成要素:关系(relation,记为r

  • 表现形式:以 “对偶(成对)” 形式存在,即r = {(a₁,a₂), (a₂,a₃), ..., (aₙ₋₁,aₙ)}
  • 核心属性:有序性—— 若某元素为aᵢ2 ≤ i ≤ n-1),其前驱固定为aᵢ₋₁,后继固定为aᵢ₊₁,元素位置不可随意互换。

(3)描述本质

线性表的逻辑结构可概括为 “均匀的数据元素 + 有序的对偶关系”,通过该描述可直观理解其 “一对一” 的线性逻辑。

5.线性表的六大基本操作:考研算法基础

老师明确线性表的 “六大基本操作” 是实现复杂功能的 “组件”,详细说明每个操作的功能、简称及应用场景:

操作序号 函数名 操作名称 核心功能 关键细节
1 InitList(&L) 初始化 构造一个空的线性表 操作起点,初始化后表长为 0
2 ListLength(L) 求长度 计算线性表中数据元素的个数 返回值为nn≥0),是空表判断、插入 / 删除位置合法性校验的基础
3 GetElem(L,i,&e) 读取(取元素) 取出第i个位置的元素,赋值给变量e 属于 “读操作”,不修改表内容;需先判断i的合法性(1 ≤ i ≤ n
4 LocateElem(L,e) 按值查找 给定值e,查找其在表中的位置(序号) 找到返回位置i,未找到返回 “特殊值”(如 0 或 - 1,需提前约定);默认返回第一个匹配元素
5 ListInsert(&L,i,e) 插入 在第i个位置之前插入新元素e 插入后表长n = n+1;“在第i个位置之后插入” 可转化为 “在第i+1个位置之前插入”
6 ListDelete(&L,i,e) 删除 删除第i个位置的元素,并返回该元素的值 删除后表长n = n-1;需先判断i的合法性(1 ≤ i ≤ n),空表不可删除

考研应用提示

六大基本操作是 “组合型考题” 的基础,例如 “合并两个有序线性表”“删除表中所有值为e的元素”“表达式运算” 等复杂功能,均需通过组合这些基本操作实现,需熟练掌握操作逻辑与边界条件。

2.2线性表的顺序存储

1.复习铺垫:逻辑结构与存储结构的核心关系

本部分旨在衔接第一章知识,明确数据结构中 “逻辑结构” 与 “存储结构” 的关键区别与联系,为后续线性表存储结构的学习奠定基础。

(1)逻辑结构:问题的 “固有属性”(唯一确定)

  • 分类框架:逻辑结构分为线性结构和非线性结构两大类,进一步可细分为四小类:
    • 线性结构(一对一关系,如本次学习的线性表);
    • 集合(无明确逻辑关系);
    • 树(一对多关系,非线性);
    • 图(多对多关系,非线性)。
  • 核心特性:对于任意一个具体问题,其逻辑结构是唯一确定的,不会因实现方式改变而变化。

(2)存储结构:问题的 “实现选择”(可灵活挑选)

  • 概念别名:存储结构又称物理结构,是数据在计算机内存中的实际存储方式。

  • 分类与学习安排:共分为四种,但因学习难度和知识逻辑,分阶段讲解:

    存储结构类型 学习阶段 核心说明
    顺序存储 前 6 章(本章重点) 基础且常用,优先学习
    链式存储 前 6 章(后续讲解) 补充顺序存储的不足
    索引存储 第 7-8 章(查找 / 排序模块) 难度较高,结合查找需求学习
    散列(哈希)存储 第 7-8 章(查找 / 排序模块) 依赖哈希函数,需结合查找场景
  • 选择依据:存储结构的选择由用户需求和效率目标决定,例如:

    • 若追求 “低成本”,可接受效率稍低的存储方式;
    • 若追求 “高速度”,可选择占用更多资源但效率更高的方式;
    • 不同选择会直接影响算法的最终效率(考研高频考点:需根据问题场景选择 “高效存储结构”)。

2.本章核心:线性表的顺序存储(顺序表)

线性表的逻辑结构是 “一对一” 的线性关系,本节聚焦其第一种存储实现 —— 顺序存储,即 “顺序表”。

(1)顺序表的定义与核心特征

  • 正式名称:线性表的顺序存储结构,简称顺序表,考试中也常简称为 “顺表”(需注意术语准确性,避免混淆)。
  • 核心定义:用物理位置的相邻来表示线性表中元素的逻辑关系,通俗表述为 “逻辑上相邻的元素,物理上也一定相邻”。
    • 例:若线性表中元素 aᵢ的前驱是 aᵢ₋₁、后继是 aᵢ₊₁(逻辑相邻),则在内存中,aᵢ₋₁、aᵢ、aᵢ₊₁的存储地址必须连续(物理相邻)。

(2)底层支撑:内存的关键特性(理解顺序表的基础)

顺序表的实现依赖内存的两个核心特点,需结合计算机基础知识点理解:

  • 特点 1:内存是 “一维线性” 的:内存空间呈连续的线性排列,无分支或跳跃,为 “物理位置相邻” 提供硬件基础。
  • 特点 2:按 “地址寻址”,区分 “内容值” 与 “地址值”:
    • 内存可类比为 “带门牌号的房子”:“房子” 是存储单元,“门牌号” 是地址值(用于定位存储单元),“房子里的东西” 是内容值(实际存储的数据);
    • 计算机通过 “总线” 区分两种值:地址值通过地址总线(Address Bus) 传输,内容值通过数据总线(Data Bus) 传输,确保二者不混淆。

(3)顺序表示例:直观理解存储逻辑

以 “线性表(10, 12, 13, 14, 15)” 为例(修正原文口误,确保逻辑连贯),说明顺序表的存储过程:

  • 逻辑关系:10 是首元素(只有后继),15 是尾元素(只有前驱),元素间为一对一的线性关系;
  • 物理存储:在内存中,10、12、13、14、15 的存储地址连续,且顺序与逻辑顺序完全一致(10 的地址 < 12 的地址 < 13 的地址 < ... < 15 的地址);
  • 核心结论:顺序表的物理存储结构与线性表的逻辑结构 “完全对齐”,无需额外信息即可通过物理位置判断元素的逻辑关系。

(4)顺序表的优缺点分析(结合实例与本质原因)

(a)优点:查找(查询)效率高
  • 具体表现:可直接通过元素的逻辑位置定位其物理地址,无需遍历或移动元素。
    • 生活类比:电影院找座位(如 17 排),无需从第 1 排数起,若看到 15 排,可直接推断 17 排在其后,快速定位;
    • 本质原因:元素物理地址连续,可通过 “首地址 + 元素索引 × 元素大小” 直接计算目标元素地址(随机访问特性)。
(b)缺点:插入、删除效率低(需大量移动元素)
  • 问题根源:顺序表要求元素 “物理位置必须连续”,插入 / 删除元素会破坏连续性,需通过移动元素恢复连续,导致操作成本高。
  • 实例说明:
    • 插入操作(如在 30 和 40 之间插入 35):需先将 40、50(假设后续元素)向后移动 1 位,腾出 30 后的位置,再存入 35;
    • 删除操作(如删除 20):计算机不会 “空出” 20 的位置,而是将 20 之后的所有元素向前移动 1 位,用后续元素覆盖 20,间接实现 “删除”。
  • 效率结论:插入 / 删除操作的时间复杂度随元素数量增加而升高(最坏情况下需移动全部元素),不适用于频繁增删的场景。

3.链表的必要性(核心矛盾:解决顺序表的效率痛点)

由于顺序表在 “插入、删除” 操作上的效率缺陷,为满足 “频繁增删仍需高效” 的需求,后续将学习线性表的第二种存储结构 ——链式存储,其核心思路是 “用指针(或引用)替代物理位置,实现逻辑关系的灵活表示”,从根本上解决元素移动的问题。

现在围绕线性表的存储结构优化展开,核心是解决顺序表插入 / 删除效率低的问题:

  • 顺序表的缺陷:逻辑相邻→物理必须相邻(连续内存),插入 / 删除时需 “搬动大量元素”,时间复杂度为 O (n),效率低。
  • 核心思路:若能不搬动元素,仅通过调整 “元素间的关联关系” 实现插入 / 删除,即可将时间复杂度降至 O (1)(常数级)。
  • 链表的定位:正是为满足此需求而生,是数据结构考研的重中之重(几乎所有考题都会涉及链式存储)。

4.链表的基本概念与核心特点

(1)定义

线性表的链式存储简称 “链式表”,俗称 “链表”,是通过节点 + 指针串联元素的存储结构。

(2)核心特点(与顺序表的本质区别)

对比维度 顺序表 链表
存储单元 必须连续(一维连续内存) 可连续、可分散(任意存储单元)
元素关联方式 物理位置相邻(隐含关联) 指针指向(显式关联)
额外空间消耗 无(仅存元素) 有(需存指针)

(3)节点的构成(链表的基本单元)

链表的每个元素需存储两部分信息,共同构成 “节点”:

  • 数据域(data):存储元素的实际值(如 10、20、30)。
  • 指针域(如 next):存储 “后继节点的地址”(单链表 1 个指针,双向链表 2 个指针)。

示例:存储 10、20、30、40 的链表节点结构

(内存地址可分散,如 10 存 10001 号、20 存 10005 号、30 存 10003 号、40 存 10006 号):

(注:NULL 为 “空指针”,表示链表末尾,大写)

5.链表的分类及详细解析(考研核心)

老师明确:考研需重点掌握3 类链表(无头节点单链表仅需了解概念),分别是 “带头节点的单向链表”“循环链表”“双向链表”。

(1)第一类:单向链表(单链表)

①分类:无头节点 vs 带头节点
类型 结构特点 考研要求
无头节点单链表 头指针直接指向第一个数据节点 仅掌握概念
带头节点单链表 头指针→头节点(数据域空)→第一个数据节点 重点掌握(结构、操作、应用)
② 带头节点单链表的核心结构
  • 头节点:数据域为空(不存有效元素),指针域指向 “第一个数据节点”;
  • 头指针(first):永远指向头节点(固定入口);
  • 尾节点:最后一个数据节点,指针域指向 NULL;
  • 空表判断:头节点的指针域为 NULL(first->next == NULL),且头指针、尾指针均指向头节点。
③带头节点单链表的核心操作(考研高频)

核心原则:不搬动元素,仅修改指针,时间复杂度 O (1)。

(a)插入操作:以 “在 30(前驱节点)和 40(后继节点)间插入 35” 为例

步骤(先连后断,避免指针丢失):

  1. 申请内存空间,存储 35(如地址 10008);
  2. 新节点的指针域→40 的地址(先连:确保后继节点不丢失);
  3. 30 的指针域→新节点的地址(后断:修改前驱节点的关联)。

最终链表:10→20→30→35→40→NULL。

(b)删除操作:以 “删除 30” 为例

步骤(迈过 + 释放,避免内存泄漏):

  1. 20 的指针域→40 的地址(迈过:跳过待删节点 30);
  2. 释放 30 所在节点的内存空间(关键:避免内存泄漏,程序长期运行会变慢)。

最终链表:10→20→40→NULL。

(2)第二类:循环链表

①核心结构(基于单链表优化)
  • 本质:首尾相连—— 尾节点的指针域不再指向 NULL,而是指向 “头节点”(带头节点时)或 “第一个数据节点”;
  • 空表判断(带头节点):头节点的指针域指向自身(first->next == first);
  • 头指针:可省略,仅需尾指针(尾指针 ->next 即头节点,访问更高效)。
②核心优点
  • 保留单链表 “插入 / 删除高效” 的优点;
  • 优化访问逻辑:从任意节点出发,沿指针可遍历所有节点(无需从头指针开始,解决单链表 “断链后无法访问前序节点” 的问题)。

(3)第三类:双向链表

①核心结构(基于单链表优化)
  • 节点构成:数据域 + 2 个指针域(前驱指针 prior:存前序节点地址;后继指针 next:存后序节点地址);
  • 带头节点时:头节点的 prior 指向 NULL,尾节点的 next 指向 NULL;
  • 双向循环链表(进阶):尾节点 next→头节点,头节点 prior→尾节点,彻底无 NULL。
②核心优点
  • 保留 “插入 / 删除高效” 的优点;
  • 优化访问逻辑:双向可访问—— 找前驱节点无需遍历(直接通过 prior 指针,时间复杂度 O (1)),解决单链表 “找前驱需从头遍历” 的痛点。
③核心操作(以 “在 ai-1 和 ai 间插入新节点” 为例)

插入步骤(需修改 4 个指针,确保双向关联正确):

  1. 新节点.prior → aᵢ-₁ 的地址;
  2. 新节点.next → ai 的地址;
  3. aᵢ-₁.next → 新节点的地址;
  4. aᵢ.prior → 新节点的地址。

删除步骤(需修改 2 个指针 + 释放空间):

  1. aᵢ-₁.next → aᵢ.next 的地址;
  2. aᵢ.next.prior → aᵢ.prior 的地址;
  3. 释放 aᵢ节点的内存空间。

6.头节点的核心作用(考研高频考点)

头节点虽 “浪费 1 个节点空间”,但能大幅简化编程逻辑,核心作用有 2 点:

  1. 统一插入 / 删除操作

    无需单独处理 “插在表头”、“删表头节点” 的特殊情况 —— 所有插入都可视为 “在某个节点后插入”(插表头 = 插在头节点后),所有删除都可视为 “删除某个节点的后序节点”,编程逻辑统一。

  2. 简化空表判断

    无表头时,空表需判断 “头指针是否为 NULL”、“删除后是否为空”,需嵌套 if;

    有表头时,空表仅需判断 “头节点的 next 是否为 NULL”,避免复杂嵌套,逻辑更简单。

7.各类存储结构优缺点对比(考研综合题基础)

存储结构 优点 缺点 适用场景
顺序表 随机查找高效(O (1));无额外空间消耗 插入 / 删除低效(O (n),需搬元素);需连续内存 查找频繁、插入删除少(如学生成绩查询)
带头节点单链表 插入 / 删除高效(O (1));内存可分散 查找低效(O (n),需从头遍历);需额外存 1 个指针 插入删除频繁、查找少(如链表式队列)
循环链表 插入 / 删除高效;任意节点可遍历所有节点 查找仍需遍历(O (n));需额外存 1 个指针 需循环访问所有元素(如约瑟夫环问题)
双向链表 插入 / 删除高效;双向访问(找前驱 O (1)) 空间消耗高(需存 2 个指针);操作步骤多 需频繁找前驱节点(如双向链表式栈)

8.考研重点总结

  1. 必须掌握的 3 类链表:带头节点的单链表、循环链表、双向链表(结构、插入 / 删除操作、空表判断);
  2. 核心考点:头节点的作用、链表插入 “先连后断” 原则、删除 “释放空间防泄漏”、双向链表指针修改逻辑;
  3. 本质思想:链表是 “用空间换时间”—— 通过额外存储指针(空间消耗),换取插入 / 删除的时间效率提升。

参考资料:教材《数据结构 C 语言 第 3 版》 数据结构考研指导(基础篇) 、数据结构考研指导(基础篇) 视频课程|赵海英

posted @ 2025-12-05 13:56  CodeMagicianT  阅读(3)  评论(0)    收藏  举报