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

链表元素查找异常:姓名查找函数printf无输出问题排查

问题分析与修复

核心问题点

  • 链表未完成初始化:主函数创建了newNode但未将其挂载到head指针上,导致head始终为NULL,查找函数的遍历循环直接跳过。
  • 函数参数传递错误:exist函数的形参是二级指针Name **head,但主函数调用时传入的是一级指针head,类型不匹配,函数内部无法正确获取链表头。
  • 字符串对比的换行符问题:fgets会将输入时的换行符\n一并读入字符串,而链表中存储的"John"不含换行符,导致strcmp永远返回非0。
  • 内存泄漏:exist函数中malloc的ptr未释放,造成内存浪费。

修复后的代码

结构体定义(无改动)

typedef struct Name { 
     char name[50];
     struct Name *next;
} Name;

修复后的查找函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

void exist(Name **head) {
    char searchName[50]; // 改用栈上数组,避免手动管理内存
    printf("Enter your name to search:\n");
    fgets(searchName, 50, stdin);
    
    // 去除fgets读入的末尾换行符
    size_t len = strlen(searchName);
    if (len > 0 && searchName[len-1] == '\n') {
        searchName[len-1] = '\0';
    }
    
    Name *p = *head;
    bool found = false;
    while (p != NULL) {
        if (strcmp(searchName, p->name) == 0) {
            printf("Node found\n");
            found = true;
            break; 
        }
        p = p->next;
    }
    if (!found)
        printf("Node not found\n");
}

修复后的主函数

int main() {
    Name *head = NULL;
    Name *newNode = malloc(sizeof(Name));
    strcpy(newNode->name, "John");
    newNode->next = NULL;
    // 将新节点挂载到链表头,完成链表初始化
    head = newNode;
    // 传入二级指针,匹配函数参数类型
    exist(&head);
    
    // 释放链表内存,避免泄漏
    free(newNode);
    return 0;
}

关键修复说明

  1. 完善链表初始化:添加head = newNode;,将创建的节点加入链表,确保查找时有可遍历的元素。
  2. 修正参数传递:调用exist时传入&head,让函数能正确访问链表头指针。
  3. 处理换行符:通过strlen定位换行符并替换为字符串结束符,保证输入字符串与链表中存储的格式一致。
  4. 避免内存泄漏:用栈上数组替代动态分配的指针,无需手动释放内存,简化代码同时解决泄漏问题。

内容的提问来源于stack exchange,提问作者Jane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:52:49