教程导航
文章目录
← 教程

数据结构

顺序表位序与数组下标

区分逻辑位序与数组下标,避免差一错误。

§ 402 顺序表位序与数组下标#

一、问题#

顺序表里第 i 个元素为什么访问 data[i-1] 而不是 data[i]?插入操作的合法范围为什么允许 i = length+1?

二、为什么是这样#

线性表用位序描述位置,从 1 开始(人的自然编号)。C 语言数组下标从 0 开始(程序的内存偏移)。两套编号并存,差 1:

位序数组下标含义
1100第 1 个元素在 data[0]
iii−1i-1第 ii 个元素在 data[i-1]
nn(当前表长)n−1n-1最后一个已有元素
n+1n+1(允许插入)nn表尾后的第一个空位

data[i-1] 里的 i-1 不是说”变成了第 i−1i-1 个”,而是”位序 ii 对应下标 i−1i-1”。

为什么插入允许 i = length+1:这表示在表尾追加元素,位序 n+1n+1 对应数组下标 nn,此时循环不执行,无需移动任何元素。访问和删除只允许 1≤i≤n1 \leq i \leq n(不能访问不存在的位置),插入则允许到 n+1n+1。

插入为什么从后往前移动元素:插入位置 ii 及其后面的元素都要后移一格。如果从前往后移,后面的元素会被覆盖,必须从最后一个开始往后移,才能给新元素腾出空间。

三、关联#

  • 1.2 顺序表:插入删除的完整代码,包含边界检查和移动逻辑

四、我的理解#

做题时先判断变量是”位序”还是”下标”。看到 ListInsert(L, 3, e) 里的 3 是位序,访问时要转成下标 data[2]。

合法范围差一:查找/删除是 1≤i≤n1 \leq i \leq n,插入是 1≤i≤n+11 \leq i \leq n+1,区别在于插入多允许一个”追加到表尾”的位置。