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

地址边界错误:C语言链表节点无法正确添加的问题排查

C语言链表追加元素失败的问题修复

问题根源分析

  1. 新节点未接入链表
    在appendToList函数中,你使用while (current != NULL)遍历链表,最终current会指向NULL。之后你虽然分配了新节点的内存,但没有将它与链表的最后一个节点建立关联——链表尾节点的next指针始终为NULL,新节点完全游离在链表结构之外。这直接导致L->head->next一直是NULL,访问它的value时触发段错误。

  2. 长度计算逻辑错误
    初始length = 1,遍历循环中每次current != NULL就执行length++,对于仅含头节点的链表,循环会执行1次(current从head变为NULL),length变为2,之后追加新节点又执行length++变为3,这与实际链表长度完全不符。

修正后的代码

重点修改appendToList函数,同时优化main中的取值逻辑:

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

typedef struct element {
    int value;
    struct element* next;
} element;

typedef struct list {
    element* head;
} list;

list* createList(int headValue) {
    list* L = malloc(sizeof(list));
    L->head = malloc(sizeof(element));
    L->head->value = headValue;
    L->head->next = NULL;
    return L;
}

// Returns the new length of the list
int appendToList(list* L, int value) {
    element* current = L->head;
    int length = 1;
    
    if (current == NULL) {
        printf("list is empty\n");
        exit(2);
    }
    // 遍历到链表的最后一个节点(而非NULL)
    while (current->next != NULL) {
        current = current->next;
        length++;
    }
 
    // 分配新节点并初始化
    element* newNode = malloc(sizeof(element));
    newNode->next = NULL;
    newNode->value = value;
    // 将新节点链接到链表尾部
    current->next = newNode;
    length++;

    return length;
}

// returns the value at index N (zero based)
//
// If the list has < N elements, returns -1 
int getAtIndexN(list* L, int N) {
    element* current = L->head;
    for (int i=0; i<N; i++) {
        if (current->next == NULL) {
            printf("unable to get to index %d\n", i+1);
            return -1;
        }
        current = current->next;
    }
    return current->value;
}

int main(int args, char** argv) {
    int initvalues[] = {1,3,4,4};
    list* L = createList(5);
    for (int i=0; i<4; i++) {
        appendToList(L, initvalues[i]);
    }
    
    // 使用安全的getAtIndexN函数获取值,避免直接访问指针
    printf("element at index 1 has value %d\n", getAtIndexN(L, 1));
    return 0;
}

关键修改点说明

  • 遍历条件改为current->next != NULL,确保current最终停在链表的最后一个有效节点上。
  • 新增newNode变量存储新分配的节点,避免覆盖current指针导致丢失尾节点引用。
  • 通过current->next = newNode将新节点正式接入链表。
  • 修正长度计算逻辑,使其与实际节点数量一致。
  • main中改用getAtIndexN函数获取值,避免直接访问未初始化的指针引发崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:05:32