You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环双向链表尾插入触发段错误,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 05:54:07