单链表无法打印问题求助:代码无输出原因排查
问题分析与解决
嘿,我一眼就揪出问题所在了——你的addFirst函数根本没真正修改到main里的head指针!
核心原因:C语言的值传递机制
在C里,当你把head传给addFirst时,传递的是head的副本。你在函数里写ptr = tmp,只是改了这个副本的指向,完全碰不到main里原本的head——它自始至终都是NULL,printAll自然打印不出任何内容。
两种可行的解决办法
方法1:用指针的指针(双重指针)传参
修改addFirst的参数为link *(也就是struct node **),这样就能直接修改外部的head指针了:
#include <stdio.h> #include <stdlib.h> typedef struct node * link; struct node{ int item; link next; }; void printAll(link head); void addFirst(link *ptr, int val ); // 修改参数为指针的指针 link removeLast(link ptr); void printAll(link head){ link ptr = head; printf("\nPrinting Linked List:\n"); while(ptr != NULL){ printf(" %d ", ptr->item); // 用ptr->item替代(*ptr).item,更简洁 ptr = ptr->next; } printf("\n"); } void addFirst(link *ptr, int val ){ link tmp = malloc(sizeof(struct node)); tmp->item = val; tmp->next = *ptr; // 指向原来的头节点 *ptr = tmp; // 直接修改外部的head指针 } int main(void) { link head = NULL; for(int i = 0; i<3; i++){ addFirst(&head, i); // 传递head的地址 } printAll(head); return 0; }
方法2:让addFirst返回新的头指针
另一种思路是让函数返回更新后的头指针,main里用这个返回值来更新head:
#include <stdio.h> #include <stdlib.h> typedef struct node * link; struct node{ int item; link next; }; void printAll(link head); link addFirst(link ptr, int val ); // 修改返回类型为link link removeLast(link ptr); void printAll(link head){ link ptr = head; printf("\nPrinting Linked List:\n"); while(ptr != NULL){ printf(" %d ", ptr->item); ptr = ptr->next; } printf("\n"); } link addFirst(link ptr, int val ){ link tmp = malloc(sizeof(struct node)); tmp->item = val; tmp->next = ptr; return tmp; // 返回新的头指针 } int main(void) { link head = NULL; for(int i = 0; i<3; i++){ head = addFirst(head, i); // 用返回值更新head } printAll(head); return 0; }
额外小优化
你代码里的(*ptr).item和(*ptr).next可以换成ptr->item和ptr->next,这是C语言指针访问结构体成员的标准写法,更简洁易读。
现在运行修改后的代码,就能正常打印出2 1 0(因为每次往头部加元素,顺序是倒的)啦!
内容的提问来源于stack exchange,提问作者37712
相关产品推荐
相关产品推荐

