C++链表pop方法删除指定节点时崩溃问题求助
LinkedList的pop方法崩溃问题修复
问题重现
实现LinkedList类的pop方法删除包含指定(n1, n2)数据的节点时,单次删除首节点操作正常;但执行多次删除(包括中间、末尾、首节点)时程序崩溃,退出码为3221225477。
错误原因
pop方法中的循环条件逻辑错误:
原循环条件为:
while (temp != NULL && temp->n1 != n1 && temp->n2 != n2)
这个条件的含义是只有当节点的n1和n2都不等于目标值时才继续遍历,这会导致只要节点的n1或n2其中一个匹配目标值,循环就会停止。例如删除(0,5)时,遇到首节点(0,0),由于temp->n1 !=0为false,整个条件不成立,循环直接终止。此时prev仍为NULL,执行prev->next会触发空指针访问,导致程序崩溃。
正确的循环条件应该是当节点的n1和n2不同时匹配目标值时继续遍历,即使用逻辑或(||)来判断不匹配的情况,或者用逻辑非包裹匹配条件。
修复后的pop方法
void pop(int n1, int n2) { Node *temp = this->start; Node *prev = NULL; if (temp != NULL && temp->n1 == n1 && temp->n2 == n2) { this->start = temp->next; delete temp; this->size--; return; } else { // 修改循环条件:当节点未匹配目标时继续遍历 while (temp != NULL && !(temp->n1 == n1 && temp->n2 == n2)) { prev = temp; temp = temp->next; } if (temp == NULL) { return; } prev->next = temp->next; this->size--; delete temp; } }
也可以将循环条件写成等价的形式:
while (temp != NULL && (temp->n1 != n1 || temp->n2 != n2))
测试验证
运行测试代码2:
int main(int argc, char const *argv[]) { LinkedList lk; lk.append(0, 0); lk.append(0, 1); lk.append(0, 2); lk.append(0, 3); lk.append(0, 5); lk.append(0, 6); lk.pop(0, 5); lk.pop(0, 1); lk.pop(0, 0); lk.pop(0, 6); lk.print(); return 0; }
输出符合预期:
n1: 0, n2: 2 n1: 0, n2: 3
内容的提问来源于stack exchange,提问作者asker
相关产品推荐
相关产品推荐

