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

创建遍历双向链表时遇Segmentation error及数据不打印问题求助

双向链表问题分析与修复

核心问题点

  • 初始化逻辑错误:你提前给head、tail、temp分配了动态内存,导致head初始值不为NULL,第一个节点的创建判断(if(head==NULL))永远不会触发,链表初始结构完全错误。空链表的head和tail应该直接初始化为NULL,不需要提前分配内存。
  • 内存分配大小错误:所有malloc调用都使用了sizeof(struct node*),这仅分配了一个指针的空间(通常4/8字节),但实际需要分配整个结构体的空间,应该改为sizeof(struct node)。
  • temp无需单独分配内存:temp是遍历用的指针,只需指向链表中已有的节点即可,不需要单独调用malloc。

修复后的完整代码

#include <stdio.h>
#include<stdlib.h>

int main()
{
    int value, ch;
    struct node{
        int data;
        struct node *next;
        struct node *prev;
    }*new_node, *head = NULL, *tail = NULL, *temp;

    do{
        // 分配正确大小的节点内存
        new_node = (struct node*)malloc(sizeof(struct node));
        if(new_node == NULL){ // 增加内存分配失败的容错判断
            printf("内存分配失败\n");
            return 1;
        }

        printf("Hello user, enter data for your node\n");
        scanf("%d", &value);
        new_node->data = value;

        if(head == NULL){ // 空链表时初始化头、尾节点
            new_node->next = NULL;
            new_node->prev = NULL;
            head = new_node;
            tail = new_node;
        }
        else{ // 非空链表时追加节点到尾部
            new_node->prev = tail;
            new_node->next = NULL;
            tail->next = new_node;
            tail = new_node;
        }

        printf("\ndo you want to add extra node? \nenter 0 to continue or 1 for exit\n");
        scanf("%d", &ch);

    }while(ch == 0);

    // 遍历打印链表数据
    temp = head;
    while(temp != NULL){
        printf("%d ", temp->data); // 增加空格优化输出可读性
        temp = temp->next;
    }

    printf("\nprogram executed");

    // 释放链表内存,避免内存泄漏
    temp = head;
    while(temp != NULL){
        struct node* next_node = temp->next;
        free(temp);
        temp = next_node;
    }

    return 0;
}

关于内存分配的疑问解答

  • 单链表仅分配new_node即可运行的原因:单链表的head初始化为NULL,第一个节点创建时直接将head指向new_node,不需要提前给head分配内存。你之前双向链表出现段错误,并非因为双向链表需要给head/tail分配内存,而是错误的初始化逻辑+内存分配大小错误导致的。
  • 需要动态分配的对象:只有实际存储数据的节点(每次创建的new_node)需要动态分配内存。head、tail、temp都是指针,只需指向已有的节点或者NULL,不需要单独分配内存。

内容的提问来源于stack exchange,提问作者SAMRAT PATEL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:31:15