C语言链表print_list函数无法打印元素问题求助
问题根源:返回值错误导致链表头丢失
你的riempilista函数犯了一个关键错误:你没有返回自己构建好的链表头节点,反而返回了一开始传入的lis(也就是NULL)。
在main函数里,你把listautente初始化为NULL传给riempilista后,函数内部确实构建了链表,但最后返回的还是原来的NULL,所以listautente依然是NULL,print_list自然只会输出START -> END。而你把打印代码放进构建函数时,用的是函数内部的temp或currentNode,那是正确的链表节点,所以能正常打印。
修正步骤
- 在
riempilista函数里新增变量保存链表的头节点(第一个创建的节点),而非只记录temp(temp最后指向的是链表尾节点)。 - 最后返回这个头节点,而不是传入的初始
lis。 - 处理用户输入
n=0的情况,避免temp未初始化就访问temp->next导致崩溃。
修正后的代码
#include <stdlib.h> #include <stdio.h> typedef struct nd { int val; struct nd *next; } node; typedef node * Lista; void print_list(node*currnode) { printf("START -> "); while (currnode != NULL) { printf("%d -> ", currnode->val); currnode = currnode->next; } printf("END\n"); // 加换行符优化输出格式 } // riempilista means "buildlist" node* riempilista(Lista lis){ node *currentNode, *temp, *head = NULL; // 新增head保存链表头节点 int i,n; printf("how many nodes?\n"); scanf("%d",&n); if (n == 0) { // 处理空链表情况 return NULL; } for (i = 0; i < n; i++) { currentNode = (node *)malloc(sizeof(node)); printf("Enter element %d : ", (i + 1)); scanf("%d", ¤tNode->val); if (i == 0) { head = currentNode; // 第一个节点就是链表头 temp = currentNode; } else { temp->next = currentNode; temp = currentNode; } } temp->next = NULL; return head; // 返回真正的链表头节点 } int main(){ Lista listautente=NULL; listautente=riempilista(listautente); print_list(listautente); // 新增内存释放代码,避免内存泄漏(新手可先养成习惯) node* temp = listautente; while (temp != NULL) { node* next = temp->next; free(temp); temp = next; } return 0; }
关键说明
head变量专门记录链表的第一个节点,这才是需要返回给main的链表入口指针。- 增加
n=0的判断,避免空链表场景下的非法内存访问。 - 返回
head而非初始传入的lis,确保main中的listautente能拿到有效链表头。 - 补充内存释放代码,养成良好的内存管理习惯,避免内存泄漏。
内容的提问来源于stack exchange,提问作者revdz
相关产品推荐
相关产品推荐

