数据结构
顺序表位序与数组下标
区分逻辑位序与数组下标,避免差一错误。
收录于
§ 402 顺序表位序与数组下标#
一、问题#
顺序表里第 i 个元素为什么访问 data[i-1] 而不是 data[i]?插入操作的合法范围为什么允许 i = length+1?
二、为什么是这样#
线性表用位序描述位置,从 1 开始(人的自然编号)。C 语言数组下标从 0 开始(程序的内存偏移)。两套编号并存,差 1:
| 位序 | 数组下标 | 含义 |
|---|---|---|
第 1 个元素在 data[0] | ||
第 个元素在 data[i-1] | ||
| (当前表长) | 最后一个已有元素 | |
| (允许插入) | 表尾后的第一个空位 |
data[i-1] 里的 i-1 不是说”变成了第 个”,而是”位序 对应下标 ”。
为什么插入允许 i = length+1:这表示在表尾追加元素,位序 对应数组下标 ,此时循环不执行,无需移动任何元素。访问和删除只允许 (不能访问不存在的位置),插入则允许到 。
插入为什么从后往前移动元素:插入位置 及其后面的元素都要后移一格。如果从前往后移,后面的元素会被覆盖,必须从最后一个开始往后移,才能给新元素腾出空间。
三、关联#
- 1.2 顺序表:插入删除的完整代码,包含边界检查和移动逻辑
四、我的理解#
做题时先判断变量是”位序”还是”下标”。看到 ListInsert(L, 3, e) 里的 3 是位序,访问时要转成下标 data[2]。
合法范围差一:查找/删除是 ,插入是 ,区别在于插入多允许一个”追加到表尾”的位置。