创建遍历双向链表时遇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
相关产品推荐
相关产品推荐

