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

C语言链表仅显示最后添加节点问题排查求助

问题排查:链表添加后仅显示最后一个节点的原因及修复

核心错误原因

在adaugare函数的判断逻辑中,你误用了赋值操作符=来替代相等比较操作符==:

if (prim = NULL)  // 此处是赋值,不是比较判断!
    return p;

这个错误会导致每次调用添加函数时,不管当前链表头prim是否为空,都会先将prim强制赋值为NULL,随后直接返回新创建的节点p(且你提前把p->urm设为了NULL)。这意味着链表永远只会保留最后添加的那个节点,之前的节点全部丢失,所以执行显示操作时只能看到最后输入的人员信息。

修复方案

1. 修正判断逻辑并简化头插法实现

头插法不需要额外判断链表是否为空,直接将新节点指向原链表头,再返回新节点作为新的链表头即可。修正后的adaugare函数如下:

C* adaugare(C*prim)
{
    
    char aux_nume[20], functie_aux[20];
    C*p;

    do
    {
        printf("nume:");
        scanf(" %s", aux_nume);

    } while (!validare(aux_nume));
    printf("functie:");
    scanf(" %s", functie_aux);
    p = (C*)malloc(sizeof(C));
    // 修正内存分配:strlen返回字节数,无需套sizeof
    p->functie = (char*)malloc(strlen(functie_aux) + 1);
    strcpy(p->nume, aux_nume);
    strcpy(p->functie, functie_aux);
    p->vechime = strlen(p->functie);

    // 头插法核心:新节点指向原链表头
    p->urm = prim;
    // 返回新的链表头
    return p;
}

2. 其他次要问题修复

  • afisare函数中的换行符错误:原代码printf(" ");无效,改为printf("\n");
  • 职位内存分配冗余:sizeof(strlen(functie_aux)+1)是多余的,因为strlen已经返回字符串的字节长度(不含终止符),直接使用strlen(functie_aux)+1即可。

修复效果验证

修复后,每次添加的新节点会成为新的链表头,同时指向之前的链表节点,链表会正确累积所有添加的人员数据,执行显示操作时就能看到全部人员信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:40:42