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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:19:01