循环双向链表尾插入触发段错误,insertafter函数问题排查求助
循环双向链表插入操作段错误排查
核心错误原因
- 首个节点初始化逻辑错误:
insert函数插入第一个节点时,新节点的next和prev被赋值为NULL(此时headnode初始值为NULL),没有形成自环结构,破坏了循环链表的基础规则,后续printnode访问空指针直接触发段错误 printnode遍历逻辑不完善:当前循环条件会漏掉最后一个节点的输出,且没有做空指针防护insertafter缺少空指针判断,鲁棒性不足
修复方案
1. 修正insert函数首个节点初始化逻辑
插入第一个节点时让新节点的next和prev指向自身,保证循环结构成立:
void insert(int data){ Node* newnode = new Node; newnode->data = data; if(headnode == NULL){ // 首个节点形成自环 newnode->next = newnode; newnode->prev = newnode; }else{ // 头插逻辑兼容非空链表场景 newnode->next = headnode; newnode->prev = headnode->prev; headnode->prev->next = newnode; headnode->prev = newnode; } headnode = newnode; }
2. 修正printnode遍历逻辑
增加空指针判断,用do-while结构保证所有节点都能正常输出:
void printnode(){ if(headnode == NULL) return; Node* cur = headnode; do{ std::cout << cur->data << "->"; cur = cur->next; }while(cur != headnode); std::cout << "\n"; }
3. 优化insertafter函数鲁棒性
增加空指针判断,避免headnode为空时调用出现异常:
void insertafter(int data){ if(headnode == NULL){ insert(data); return; } Node* newnode = new Node; newnode->data = data; newnode->next = headnode; Node* existingnode = headnode; while(existingnode->next != headnode){ existingnode = existingnode->next; } existingnode->next = newnode; newnode->prev = existingnode; headnode->prev = newnode; }
完整可运行代码
#include<iostream> struct Node{ int data; Node* next; Node* prev; }; Node* headnode; void insert(int data){ Node* newnode = new Node; newnode->data = data; if(headnode == NULL){ newnode->next = newnode; newnode->prev = newnode; }else{ newnode->next = headnode; newnode->prev = headnode->prev; headnode->prev->next = newnode; headnode->prev = newnode; } headnode = newnode; } void insertafter(int data){ if(headnode == NULL){ insert(data); return; } Node* newnode = new Node; newnode->data = data; newnode->next = headnode; Node* existingnode = headnode; while(existingnode->next != headnode){ existingnode = existingnode->next; } existingnode->next = newnode; newnode->prev = existingnode; headnode->prev = newnode; } void printnode(){ if(headnode == NULL) return; Node* cur = headnode; do{ std::cout << cur->data << "->"; cur = cur->next; }while(cur != headnode); std::cout << "\n"; } int main(){ headnode = NULL; int x, data; std::cin >> x; for(int i = 0; i < x; i++) { std::cin >> data; if(i == 0) { insert(data); } else { insertafter(data); } printnode(); } return 0; }
内容的提问来源于stack exchange,提问作者shyam0x
相关产品推荐
相关产品推荐

