C语言代码中showLL函数无法打印的问题及scanf判断咨询
C语言链表问题排查与输入逻辑解答
一、链表showLL无法打印的问题排查
你的代码存在多个关键错误,导致链表无法正确构建,进而showLL没有输出:
函数声明与定义不匹配
你声明的makeNode()和joinLL()未指定参数,但实际定义时带参数,会引发编译警告甚至运行错误。修正声明:NodeT *makeNode(int v); NodeT *joinLL(NodeT *head, int v);head指针未初始化
main中NodeT *head;未初始化为NULL,属于野指针,链表初始状态应为空,需修改为:NodeT *head = NULL;链表插入时的指针传递错误
当前joinLL按值传递head,函数内对head的修改仅作用于局部副本,main中的head始终为初始的NULL,链表始终为空。
修正方案:让joinLL返回更新后的头指针,main接收该返回值:- 修改
joinLL的返回逻辑:NodeT *joinLL(NodeT *head, int v){ NodeT *insert = makeNode(v); insert->next = NULL; if (head == NULL){ head = insert; } else{ NodeT *temp = head; while (temp->next != NULL){ temp = temp->next; } temp->next = insert; } return head; // 返回更新后的头指针 } - 在
main中调用时更新head:head = joinLL(head, a); // 注意传a而非&a,之前参数类型不匹配
- 修改
调用joinLL时的参数错误
你调用joinLL(head, &a)时传入了int*类型的&a,但joinLL第二个参数是int类型,类型不匹配会导致数据错误,改为传a即可。showLL打印逻辑冗余
当前每次循环都输出“Done. List is”,会重复显示,调整为提示语在循环外,循环内仅打印元素:void showLL(NodeT *head) { printf("Done. List is: "); NodeT *p; for (p = head; p != NULL; p = p->next) { printf("%d-->", p->data); } printf("NULL\n"); }
二、输入非数字时打印“Done.”的逻辑验证
可以用scanf("%d", &a)!=1实现该逻辑,但你的代码存在冗余:
- 原
while(scanf("%d", &a))循环会在scanf返回0(输入非数字)或EOF时退出,退出原因本身就是读取整数失败,无需再次调用scanf,直接在循环结束后打印即可:int main(void){ NodeT *head = NULL; printf("Enter an integer:"); while (scanf("%d", &a) == 1){ // 明确判断读取成功才继续 head = joinLL(head, a); printf("Enter an integer:"); } showLL(head); printf("Done.\n"); // 循环退出直接打印 freeLL(head); return 0; } - 补充说明:输入非数字时
scanf返回0,!=1成立;输入EOF(如Ctrl+D/Ctrl+Z)时scanf返回EOF,!=1也成立,两种情况都能触发“Done.”打印,符合需求。唯一需要注意的是,非数字字符会留在输入缓冲区,若后续有其他输入操作需额外处理,但你的代码循环结束后直接退出,无需担心。
内容的提问来源于stack exchange,提问作者xzha_athena
相关产品推荐
相关产品推荐

