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

链表尾部插入新节点后显示垃圾值,求助问题排查与解决

问题分析与解决方案

你的代码出现垃圾值的核心原因有两个:

1. createList 函数多创建了一个未初始化的空节点

在createList的循环中,你给每一个节点(包括最后一个有效节点)都创建了下一个节点,最终导致链表末尾多了一个未赋值的空节点。插入新节点时,这个空节点会被当作链表的最后一个节点,新节点被接在它后面。当display遍历到这个空节点时,就会输出垃圾值。

修正后的createList函数:

void createList(st *head)
{
    st *p;
    p = head;
    int i = 0;
    char x = ' ';

    printf("Enter number of nodes: ");
    scanf("%d", &n);
    scanf("%c", &x);

    for (i = 1; i <= n; i++)
    {
        printf("Enter name: ");
        gets(head->name);
        printf("Enter roll number: ");
        scanf("%d", &(head->roll));
        scanf("%c", &x);
        
        // 仅当不是最后一个节点时,才创建下一个节点
        if (i != n)
        {
            head->next = (st *)malloc(sizeof(st));
            head = head->next;
        }
    }
    // 最后一个有效节点的next设为NULL,标志链表结束
    head->next = NULL;
}

2. display函数的循环条件错误

原display函数的循环条件是while (head->next != NULL),这意味着只有当当前节点的下一个节点存在时,才会显示当前节点。虽然在初始情况下能正常显示(因为最后一个有效节点的下一个是空节点),但插入新节点后,空节点的下一个是新节点,导致空节点被错误地显示出来。

修正后的display函数:

void display(st *head)
{
    // 遍历直到当前节点为NULL,确保所有有效节点都被显示
    while (head != NULL)
    {
        printf("\nName\t\t:\t%s", head->name);
        printf("\nRoll no.\t:\t%d", head->roll);
        head = head->next;
    }
}

额外建议:替换不安全的gets函数

gets函数存在缓冲区溢出风险,建议使用fgets替代,并处理读取到的换行符:

// 替换gets(head->name)为:
fgets(head->name, sizeof(head->name), stdin);
// 去除fgets读取的换行符
head->name[strcspn(head->name, "\n")] = '\0';

修正后再运行代码,插入新节点后就能正常显示所有节点的数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:15:43