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

C语言中通过函数修改链表参数并实现节点追加的问题

C语言链表传参实现外部节点追加的可行性与实现方案

这个需求完全可行。在C语言中,想要在函数内修改外部的链表变量并同步生效,只需传递链表头指针的指针(即n_t **类型参数),通过它直接操作外部的头指针变量,就能实现节点追加的同步更新。

原代码的问题分析

你的save函数存在逻辑错误,导致第一次调用时会生成循环链表,无法正确追加节点:
当第一次调用save时,*item为NULL,执行*item = link将新节点设为链表头,但后续代码并未终止,而是继续遍历(此时链表只有一个节点,(*pointer)->next为NULL,循环不执行),随后又将(*pointer)->next赋值为link,导致第一个节点的next指向自身,形成循环链表,后续访问会出现异常。

修正后的实现代码

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

typedef struct NS
{
    char * name;
    char * value;
    struct NS * next;
} n_t;

void save(char * name, char * value, n_t ** item)
{
    // 分配新节点内存并初始化
    n_t * link = malloc(sizeof(struct NS));
    link->name = name;
    link->value = value;
    link->next = NULL;
    
    // 链表为空时,直接将新节点设为头节点
    if (*item == NULL) {
        *item = link;
        return;
    }

    // 遍历找到链表的尾节点
    n_t * pointer = *item;
    while (pointer->next != NULL) {
        pointer = pointer->next;
    }
    // 将新节点追加到尾节点之后
    pointer->next = link;
}

int main()
{
    n_t * mem = NULL;

    save("hello", "val123", &mem);
    printf("-> %s\n", mem->value);

    save("abc", "hello", &mem);
    printf("-> %s\n", mem->value);
    printf("-> %s\n", mem->next->value);

    return 0;
}

关键修正点

  • 当链表为空时,设置头节点后直接return,避免后续重复操作
  • 使用普通指针遍历查找尾节点,逻辑更简洁直观
  • 修复后运行结果完全符合预期:
    -> val123
    -> val123
    -> hello
    

内容的提问来源于stack exchange,提问作者Kaan Yılmaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:10:43