链表删除指定元素出现运行时错误,请求排查问题
排查链表Delete操作的无限循环问题
我看到你的deleteinbtw函数里藏着一个无限循环的问题,这就是程序冻结的根源!咱们来一步步拆解问题:
核心问题分析
- 无限循环触发点:你把
temp=temp->next;放在了while循环的外面,这意味着进入else分支后,循环里的temp永远不会向后移动。只要temp->next不为NULL,循环就会一直跑下去,直接导致程序卡死。 - 删除后未终止循环:就算侥幸找到目标节点并删除,程序还是会继续循环,可能会访问已经被释放的内存,引发未定义行为。
- 未初始化的指针:
Node *temp=listptr, *temp1;;里的temp1没有初始化,虽然实际使用前会赋值,但养成初始化的习惯能避免野指针风险。
修正后的代码
void List::deleteinbtw(int num) { Node *temp = listptr; Node *temp1 = nullptr; // 初始化指针,避免野指针风险 if (listptr == NULL) { cout << "\nList is Empty!\n"; return; // 空链表直接返回,避免后续无效操作 } // 处理头节点就是目标的情况 if (temp->data == num) { listptr = listptr->next; delete temp; return; // 删除后直接返回,不用走后面的逻辑 } // 遍历寻找中间/尾节点 while (temp->next != NULL) { if (temp->next->data == num) { temp1 = temp->next; temp->next = temp1->next; delete temp1; return; // 删除成功后立即退出循环,避免无效遍历 } temp = temp->next; // 每次循环移动temp,正常遍历链表 } // 如果走到这里,说明没找到目标节点 cout << "\nNode with value " << num << " not found in the list!\n"; }
关键修改说明
- 把
temp=temp->next;移到了while循环内部,确保每次循环temp都会向后移动,正常遍历整个链表,彻底解决无限循环问题。 - 在删除头节点和找到目标节点后都添加了
return,既避免后续不必要的操作,也防止删除后继续循环导致的内存访问错误。 - 初始化
temp1为nullptr,规范指针使用,降低野指针风险。 - 增加了未找到目标节点的提示,让程序的反馈更清晰友好。
内容的提问来源于stack exchange,提问作者Rajan Pandey
相关产品推荐
相关产品推荐

