链表元素查找异常:姓名查找函数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; }
关键修复说明
- 完善链表初始化:添加
head = newNode;,将创建的节点加入链表,确保查找时有可遍历的元素。 - 修正参数传递:调用
exist时传入&head,让函数能正确访问链表头指针。 - 处理换行符:通过
strlen定位换行符并替换为字符串结束符,保证输入字符串与链表中存储的格式一致。 - 避免内存泄漏:用栈上数组替代动态分配的指针,无需手动释放内存,简化代码同时解决泄漏问题。
内容的提问来源于stack exchange,提问作者Jane
相关产品推荐
相关产品推荐

