调用exists()方法后出现段错误,双向链表deleteNode方法故障排查
双向链表段错误根因分析与修复
核心问题点
- 空指针解引用:
deleteNode方法没有处理未找到匹配id节点的场景:当遍历完整个链表都没有找到对应id的节点时,position会被赋值为NULL,后续直接访问position->prev属于非法内存访问,直接触发段错误。 - 边界场景遗漏:当链表只有1个节点且需要删除该节点时,执行
head = head->next后head会变成NULL,后续直接访问head->prev也属于空指针解引用。 - 注:
exists方法本身没有逻辑问题,段错误100%由deleteNode的逻辑漏洞触发
修复方案
修改后的deleteNode代码如下:
bool LinkedList::deleteNode(int id){ bool didDelete = false; bool hasResult = false; Node *position; position = head; while(position!=NULL && !hasResult){ if(id == position->data.id){ hasResult = true; } else { std::cout << "position->next" << std::endl; position = position->next; } } // 无匹配节点直接返回 if (position == NULL) { return didDelete; } // 删除头节点 if (position->prev == NULL) { head = head->next; // 仅当删除后链表非空时设置头节点前驱 if (head != NULL) { head->prev = NULL; } delete (position); didDelete = true; } // 删除中间节点 else if (position->next != NULL) { position->prev->next = position->next; position->next->prev = position->prev; position->next = NULL; position->prev = NULL; delete(position); didDelete = true; } // 删除尾节点 else{ position->prev->next = NULL; position->prev = NULL; delete(position); didDelete = true; } return didDelete; } // End of deleteNode
内容的提问来源于stack exchange,提问作者ProgrammingSensei
相关产品推荐
相关产品推荐

