C语言实现链表时,自定义generation函数内的while循环无法运行,移至主函数则正常的问题排查
问题分析与解决
嘿,我一眼就揪出问题根源啦——你的generation()函数里的choice变量没有初始化!
为什么会这样?
在C语言中,局部变量(比如generation()里定义的choice)如果没有显式赋值,它的初始值是未定义的垃圾值。你运行程序时,这个垃圾值刚好是0,导致while(choice)的条件直接不成立,循环根本没机会启动。而当你把代码移到main()里时,要么你无意间给choice赋了初始值,要么刚好main()里的局部变量垃圾值非0,所以循环能正常跑起来。
修复方案
只需要在generation()函数里给choice设置一个初始值(比如设为1,让循环先执行一次),就能解决问题:
#include<stdio.h> #include<stdlib.h> void generation(void); void first(void); void end(void); void middle(void); int n=0; struct node{ int data; struct node *next; }; struct node *head,*newnode,*temp,*prevnode; // 注意:main标准返回类型是int,不是void int main(){ generation(); first(); end(); middle(); return 0; } void generation(void){ head=0; // 给choice赋初始值1,让循环先执行一次 int choice = 1; while(choice){ newnode=(struct node*)malloc(sizeof(struct node)); // 建议检查malloc是否成功 if(newnode == NULL){ printf("内存分配失败!\n"); exit(1); } printf("Enter data\n"); scanf("%d",&newnode->data); newnode->next=0; if(head==0)head=temp=newnode; else{ temp->next=newnode; temp=newnode; } printf("Enter for going further(0,1)\n"); scanf("%d",&choice); n++; } temp=head; printf("Your data is:\n"); while(temp!=0){ printf("Values are %d\n",temp->data); temp=temp->next; } }
额外建议
- 尽量避免全局变量:你现在的
head、temp等都是全局变量,这会让代码耦合度高,不易维护。更好的做法是让generation()返回链表头指针,或者通过指针参数传递链表头。 - 检查
malloc返回值:内存分配可能失败,一定要判断newnode是否为NULL,避免后续操作崩溃。 - 遵循C标准:
main()函数的标准返回类型是int,建议改为int main()并返回0,这样更规范。
内容的提问来源于stack exchange,提问作者Happy_kamboj
相关产品推荐
相关产品推荐

