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

C语言链表无法正常打印,怀疑插入逻辑存在错误求助排查

问题分析与代码修复

咱们来一步步拆解你代码里的问题,这就能明白为啥链表打印不出来啦:

核心问题1:未初始化的temp触发未定义行为

你定义了INT_LIST *temp;但没有给它初始化任何值,直接就用while (temp->number != 0)做循环判断。这时候temp是野指针,指向的内存地址是随机的,访问它的number成员会导致程序崩溃或者出现不可预测的行为,连插入逻辑都没法正常启动。

核心问题2:插入循环的逻辑顺序完全颠倒

你现在的流程是「先判断temp的number→再分配内存→输入数字」,这完全不符合逻辑。正确的流程应该是:

  • 先分配内存
  • 输入数字
  • 判断数字是否为0:如果是0,就不插入链表,直接退出循环;如果不是0,再把节点插入链表

核心问题3:遍历指针trvPtr初始化时机错误

你一开始把trvPtr初始化为start(此时start是NULL),之后插入元素时start被不断更新为新的头节点,但trvPtr还是保持最初的NULL值。后面的打印循环while (trvPtr != NULL)自然不会执行,所以啥内容都打印不出来。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
typedef struct intList { int number; struct intList *next; } INT_LIST;

int main() {
    INT_LIST *start = NULL, *temp;
    INT_LIST *trvPtr;
    
    /* Insert into list */
    while (1) { // 先进入循环,再处理输入
        temp = malloc(sizeof(INT_LIST));
        if (temp == NULL) { // 别忘了检查内存分配是否成功
            printf("Memory allocation failed!\n");
            return 1;
        }
        printf("Enter your integer (enter 0 to stop): ");
        scanf("%d", &(temp->number));
        
        if (temp->number == 0) { // 如果输入0,释放内存并退出循环
            free(temp);
            break;
        }
        
        // 头插法插入节点
        temp->next = start;
        start = temp;
    }
    
    printf("List is: \n");
    trvPtr = start; // 这里才初始化遍历指针,指向更新后的头节点
    while (trvPtr != NULL) {
        printf("%d ", trvPtr->number); // 加个空格,打印更美观
        trvPtr = trvPtr->next;
    }
    
    // 别忘了释放链表内存,避免内存泄漏
    trvPtr = start;
    while (trvPtr != NULL) {
        temp = trvPtr;
        trvPtr = trvPtr->next;
        free(temp);
    }
    
    return 0;
}

关于你疑惑的「循环外分配内存」

其实你看到的循环外分配内存,一般是尾插法的场景(需要先创建一个头节点或者尾节点),而你这里用的是头插法,循环内分配内存是完全没问题的——你的问题根本不在内存分配的位置,而是前面提到的指针初始化、循环逻辑顺序的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:27:52