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

C语言链表显示问题:访问节点时出现段错误

链表添加节点失败问题分析与修复

你遇到的问题核心是**add函数没有正确将新节点链接到链表尾部**,仅修改了局部临时指针的指向,新节点并未真正加入链表,导致后续无法访问这些节点——内存没有被释放,只是变成了无法追踪的游离内存。

错误点解析

在add函数中,你通过while循环遍历到temp1为NULL(链表尾部之后的位置),然后执行temp1 = new。但temp1是局部变量,这个赋值只会改变temp1自身的指向,不会修改原链表最后一个节点的nextNode指针。原链表尾部节点的nextNode依然是NULL,新节点和链表完全没有关联。

修复后的代码

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

struct node
{
    int data;
    struct node *nextNode;
};

struct node *head;

void add(int data)
{
    struct node *new = (struct node *)malloc(sizeof(struct node));
    new->data = data;
    new->nextNode = NULL;

    // 处理链表为空的边界情况
    if (head == NULL)
    {
        head = new;
        return;
    }

    struct node *temp1 = head;
    // 遍历到链表最后一个节点(而非遍历到NULL)
    while (temp1->nextNode != NULL)
    {
        temp1 = temp1->nextNode;
    }
    // 将最后一个节点的nextNode指向新节点,完成链接
    temp1->nextNode = new;
}

void printList()
{
    int i = 1;
    struct node *tempP = head;
    while (tempP != NULL)
    {
        printf("第%d个元素的数据是:%d\n", i, tempP->data);
        tempP = tempP->nextNode;
        i++;
    }
}

// main函数标准返回类型为int
int main()
{
    head = (struct node *)malloc(sizeof(struct node));
    head->data = 10;
    head->nextNode = NULL;
    add(20);
    add(30);
    add(40);
    printList();

    // 释放链表内存,避免内存泄漏
    struct node *temp;
    while (head != NULL)
    {
        temp = head;
        head = head->nextNode;
        free(temp);
    }
    return 0;
}

额外优化说明

  1. 打印指针地址时,应使用%p格式符而非%d,%d仅用于打印整数,指针地址用%p才符合标准。
  2. main函数的标准返回类型是int,而非void,程序正常结束时需返回0。
  3. 修复代码添加了链表内存释放逻辑,避免长期运行导致内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:02:06