You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言代码中showLL函数无法打印的问题及scanf判断咨询

C语言链表问题排查与输入逻辑解答

一、链表showLL无法打印的问题排查

你的代码存在多个关键错误,导致链表无法正确构建,进而showLL没有输出:

  1. 函数声明与定义不匹配
    你声明的makeNode()和joinLL()未指定参数,但实际定义时带参数,会引发编译警告甚至运行错误。修正声明:

    NodeT *makeNode(int v);
    NodeT *joinLL(NodeT *head, int v);
    
  2. head指针未初始化
    main中NodeT *head;未初始化为NULL,属于野指针,链表初始状态应为空,需修改为:

    NodeT *head = NULL;
    
  3. 链表插入时的指针传递错误
    当前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,之前参数类型不匹配
      
  4. 调用joinLL时的参数错误
    你调用joinLL(head, &a)时传入了int*类型的&a,但joinLL第二个参数是int类型,类型不匹配会导致数据错误,改为传a即可。

  5. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:15:05