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
相关产品推荐
相关产品推荐

