C语言ADT List添加同秩元素后列表内容的疑问求解
C语言ADT List操作结果解析与疑问解答
我想了解C语言中已实现的ADT List(抽象数据类型列表)执行以下操作后的内容。给出的代码如下:
int main() { PtList L = listCreate(); listAdd(L, 0, 'a'); listAdd(L, 2, 'b'); listAdd(L, 1, 'c'); listAdd(L, 1, 'd'); listAdd(L, 3, 'e'); listAdd(L, 2, 'f'); listAdd(L, 3, 'f'); listDestroy(&L); return EXIT_SUCCESS; }
我原本认为同秩位置不能存在多个元素,因此回答L = a,d,f,f,但给出的解决方案是L = a, d, f, f, c, e,这让我无法理解。既然允许存在相同元素,那元素'b'去哪了?
核心问题解析
要搞清楚这个结果,得拆解每一步listAdd的执行逻辑(基于标准ADT List的常见实现):
1. listAdd的基本规则
标准ADT List的listAdd(L, r, elem)操作,对插入秩r有严格要求:0 ≤ r ≤ 当前列表长度:
- 若
r等于当前列表长度,元素会被添加到列表末尾; - 若
r在0到当前长度-1之间,元素会插入到秩r的位置,原位置及之后的元素自动后移(不是覆盖,所以同秩位置可以多次插入元素,每次插入都会让后续元素顺位后移); - 若
r > 当前列表长度,该插入操作会被判定为无效,元素直接被丢弃(这就是元素'b'消失的原因)。
2. 逐步骤模拟操作过程
我们一步步跟踪列表的变化:
- 初始状态:
listCreate()创建空列表,长度为0。 listAdd(L, 0, 'a'):秩0等于当前长度0,插入后列表为['a'],长度1。listAdd(L, 2, 'b'):当前列表长度为1,秩2 > 1,操作无效,'b'被丢弃,列表仍为['a'],长度1。listAdd(L, 1, 'c'):秩1等于当前长度1,添加到末尾,列表变为['a', 'c'],长度2。listAdd(L, 1, 'd'):在秩1的位置插入'd',原秩1的'c'后移,列表变为['a', 'd', 'c'],长度3。listAdd(L, 3, 'e'):秩3等于当前长度3,添加到末尾,列表变为['a', 'd', 'c', 'e'],长度4。listAdd(L, 2, 'f'):在秩2插入'f',原秩2的'c'后移,列表变为['a', 'd', 'f', 'c', 'e'],长度5。listAdd(L, 3, 'f'):在秩3插入'f',原秩3的'c'后移,列表变为['a', 'd', 'f', 'f', 'c', 'e'],长度6。
3. 疑问解答
- 为什么同秩位置可以有多个元素?:
listAdd是插入操作而非覆盖操作,每次在某一秩插入元素时,原位置的元素会向后移动一位,因此多次插入会让新元素依次排在目标位置,不会覆盖原有元素,自然可以出现多个元素在原同秩位置的后续位置上。 - 元素
'b'去哪了?:插入'b'时,列表的当前长度仅为1,允许的插入范围是0~1,而指定的秩2超出了这个范围,所以该插入操作直接无效,'b'没有被加入列表。
内容的提问来源于stack exchange,提问作者Drake 2003
相关产品推荐
相关产品推荐

