C语言空单链表插入元素无输出问题排查求助
问题排查与修复方案
你的问题出在链表头指针的传递方式上,咱们一步步拆解清楚:
核心错误原因
C语言里函数参数默认是「值传递」——当你把主函数里的list(初始为NULL)传给addElement的List参数时,实际上是复制了一份指针的副本给形参。当你在函数里写List = new时,只是修改了这个局部副本的指向,主函数里的原始list指针完全没被改变,依然是NULL,所以最后打印的时候自然什么都没有。
两种修复方法
方法1:使用指针的指针(双重指针)传递参数
这种方式能让函数直接修改主函数里的指针变量本身,是链表操作里最常用的写法:
#include <stdio.h> #include <stdlib.h> typedef struct Node{ int val; struct Node* next; }ll; // 把参数改成ll** List,接收指针的地址 void addElement(ll** List, int num){ ll* newNode = malloc(sizeof(ll)); if(newNode == NULL){ printf("NO MEMORY\n"); exit(0); } newNode->val = num; newNode->next = NULL; // 这里判断的是*List(主函数里的list)是否为NULL if(*List == NULL){ *List = newNode; // 直接修改主函数里的list指针 return; } ll* curr = *List; while(curr->next != NULL){ curr = curr->next; } curr->next = newNode; } void printElements(ll* List){ ll* curr = List; while(curr != NULL){ printf("%i\n", curr->val); curr = curr->next; } } int main(){ ll* list = NULL; // 调用时传list的地址&list addElement(&list, 20); addElement(&list, 30); addElement(&list, 19); printElements(list); return 0; }
方法2:让函数返回更新后的链表头指针
这种方式更直观,每次插入后把新的头指针返回给主函数,由主函数更新自己的指针:
#include <stdio.h> #include <stdlib.h> typedef struct Node{ int val; struct Node* next; }ll; // 返回类型改成ll*,返回更新后的链表头 ll* addElement(ll* List, int num){ ll* newNode = malloc(sizeof(ll)); if(newNode == NULL){ printf("NO MEMORY\n"); exit(0); } newNode->val = num; newNode->next = NULL; if(List == NULL){ return newNode; // 空链表时直接返回新节点作为新头 } ll* curr = List; while(curr->next != NULL){ curr = curr->next; } curr->next = newNode; return List; // 非空链表返回原头指针 } void printElements(ll* List){ ll* curr = List; while(curr != NULL){ printf("%i\n", curr->val); curr = curr->next; } } int main(){ ll* list = NULL; // 每次调用都把返回值赋值给list list = addElement(list, 20); list = addElement(list, 30); list = addElement(list, 19); printElements(list); return 0; }
额外小提示
你可以在调试时加几句打印,比如在主函数里打印&list(指针的地址),在addElement里打印&List(形参的地址),会发现这两个地址不一样——这就是值传递的本质:形参是实参的副本,修改副本不会影响实参。
内容的提问来源于stack exchange,提问作者BroBot
相关产品推荐
相关产品推荐

