上述的void DeleteX(SeqList *q,ElemType x)函数有问题吗
时间: 2024-09-15 18:11:04 浏览: 39
上述的`void DeleteX(SeqList *q, ElemType x)`函数存在一个问题,当找到第一个等于`x`的元素并将其删除后,没有正确地调整`length`字段。当前,`q->length--`这一行只减少了元素的数量,但没有更新`length`的值。正确的做法是在遍历结束后,更新`length`以反映实际的元素个数。
修复后的代码片段应该是:
```c
void DeleteX(SeqList *q, ElemType x)
{
int i, j;
for (i = 0; i < q->length; i++) // 使用 'q->length' 而不是 'length' 来防止数组越界
{
if (q->elem[i] == x)
{
for (j = i; j < q->length - 1; j++) // 将后面的元素向前移位
{
q->elem[j] = q->elem[j + 1];
}
// 删除最后一个元素后,减去1而不是直接访问下一个索引
q->length--;
// 或者这里可以将 length 更新后继续循环,以简化代码
// i = j; // 继续查找其他值为 x 的元素
}
}
}
```
现在函数在删除元素后,能正确地减少列表长度,以保持数据结构的一致性。
阅读全文