C语言实现栈式双向链表第二次迭代时头指针仍为NULL问题求助
问题原因
你遇到的head指针第二次迭代仍为NULL的核心原因是C语言函数参数是值传递:
- 你在
add函数里修改的head是传入实参的局部副本,函数执行结束后这个副本就会销毁,根本不会修改main函数里的原始head变量 - 你在
main里调用add(head)时没有接收函数返回的新头指针,导致每次循环传入的永远是初始值NULL,之前创建的节点全部内存泄漏
除此之外你的代码还有3个隐患:
- 输入判断逻辑错误:
gets(buf)返回值是char*类型指针,和字符常量'0'比较完全没有意义,无法正确识别终止输入 - 缺失头文件:使用了
strlen、strcpy等字符串函数但没有引入<string.h>,会触发编译警告甚至运行时错误 - 使用了标准废弃的危险函数
gets(),存在缓冲区溢出风险,且没有做内存分配失败的判空处理
修复方案
- 调用
add函数时必须用原始head指针接收返回值,更新头节点指向 - 修正输入判断逻辑,替换危险的
gets()为fgets(),处理fgets自带的换行符 - 补全缺失的头文件,增加必要的内存分配判空,避免野指针
修复后完整代码
#include <stdio.h> #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #define LEN 1000 typedef struct list { char* string; struct list* prev, * next; }LL; LL* add(LL* head) { LL* temp = (LL*)malloc(sizeof(LL)); if (temp == NULL) { return head; } char buf[LEN]; if (fgets(buf, LEN, stdin) == NULL) { free(temp); return head; } // 去除fgets读取到的末尾换行符 buf[strcspn(buf, "\n")] = '\0'; // 输入为0时终止添加 if (strcmp(buf, "0") == 0) { free(temp); return NULL; } temp->string = (char*)malloc(strlen(buf) + 1); strcpy(temp->string, buf); // 头插逻辑(新节点始终插在链表头部,符合栈的后进先出特性) temp->prev = NULL; temp->next = head; if (head != NULL) { head->prev = temp; } head = temp; return head; } int main() { LL* head = NULL; int i = 0; while (i != 3) { // 核心修复:接收add返回的新头指针 head = add(head); i++; } // 可自行补充链表遍历、内存释放逻辑 return 0; }
内容的提问来源于stack exchange,提问作者chr
相关产品推荐
相关产品推荐

