C++双向链表调用删除函数后无法接收新输入问题排查
问题排查与修复方案
问题根因
- 构造函数初始化不全:仅初始化了
first指针,未初始化last指针,初始状态下last为野指针,存在非法访问风险。 - 空指针访问:
remove_last函数未校验链表是否为空,直接访问first->next,空链表调用时触发未定义行为。 - 野指针残留:删除链表最后一个节点后,没有将
first、last指针重置为NULL,后续调用append时无法识别链表为空,尝试访问野指针内存,导致新节点无法正常插入。 - 无边界校验:触发#删除逻辑时未判断链表剩余节点数量,#数量超过已有字符数时会重复调用空链表的删除逻辑,放大上述问题。
修复代码
1. 修复构造函数
doubleList() : first(nullptr), last(nullptr) {} // 同时初始化头尾指针
2. 修复remove_last函数
void doubleList::remove_last() { // 空链表直接返回,不做处理 if (first == nullptr) { return; } // 仅存一个节点的场景 if (first->next == nullptr) { delete first; // 重置头尾指针避免野指针 first = nullptr; last = nullptr; return; } // 多节点场景删除尾节点 Node* toDelete = last; last = last->prev; delete toDelete; last->next = nullptr; }
3. 可选优化(更严谨的删除逻辑)
修复remove_last后原有逻辑已经可以正常运行,也可以进一步优化main中的删除逻辑避免无效调用:
if (ch[i] == '#') { list.remove_last(); // 删除刚追加的# // 还有剩余节点才删除前一个输入字符 if (list.first != nullptr) { list.remove_last(); } }
验证效果
修复后输入ab#####efgh,程序会正确输出efgh,符合预期。
内容的提问来源于stack exchange,提问作者user486543
相关产品推荐
相关产品推荐

