C语言链表查找异常问题:searchByCity函数返回结果与searchByName重复
C语言链表查找异常问题:searchByCity函数返回结果与searchByName重复
兄弟我看你遇到的问题,十有八九是searchByCity函数的实现出了复制粘贴的疏漏!大概率是你写完searchByName后,直接复制代码改了函数名,但忘了把核心的查找判断逻辑改掉——比如还在对比节点的name字段,而不是address(也就是你说的city相关字段)。
先给你梳理几个最可能的坑,以及对应的修正方法:
1. 核心查找逻辑没修改(最常见)
你可能写的searchByCity函数是这样的错误版本:
// 错误的searchByCity,还在对比name字段 rubrica* searchByCity(rubrica* head, const char* city) { rubrica* current = head; while (current != NULL) { if (strcmp(current->name, city) == 0) { // 这里应该改成current->address! return current; } current = current->next; } return NULL; }
正确的写法应该把对比的字段换成address(如果你的address字段直接存城市;如果是完整地址包含城市,就用strstr来匹配子串):
// 正确的searchByCity函数 rubrica* searchByCity(rubrica* head, const char* city) { rubrica* current = head; while (current != NULL) { // 情况1:address字段直接存城市,用strcmp完全匹配 if (strcmp(current->address, city) == 0) { return current; } // 情况2:address是完整地址(比如"New York 123 St"),用strstr匹配城市子串 // if (strstr(current->address, city) != NULL) { // return current; // } current = current->next; } return NULL; }
2. 共用全局变量存储结果
如果你把找到的节点存在全局指针里,比如:
rubrica* foundNode; // 全局变量 rubrica* searchByName(...) { // ...找到后赋值给foundNode } rubrica* searchByCity(...) { // ...同样赋值给foundNode }
这种情况下如果第一次查找的结果没被覆盖(比如第二次没找到),就会返回之前的结果。解决方法是让每个函数用局部指针遍历,找到后直接返回该指针,不要用全局变量。
3. 输出逻辑没区分(次要但可能混淆)
如果你的输出代码不管是哪个查找函数调用,都只打印和名字相关的信息,也会让你误以为结果重复。其实只要查找逻辑正确,输出时打印节点的所有字段(name、number、address)就能区分开。
另外还要补全你没写完的createList函数的收尾部分:
rubrica *createList() { char name[30]; char number[30]; char address[30]; printf("type the name of first contact\n"); scanf("%s", name); printf("type the number of first contact\n"); scanf("%s", number); printf("type the address of first contact\n"); scanf("%s", address); rubrica *head = (rubrica *)malloc(sizeof(rubrica)); strcpy(head->name, name); strcpy(head->number, number); strcpy(head->address, address); head->next = NULL; // 这里要补上NULL,不然链表尾会是野指针 return head; }
按照上面的方法检查修改后,应该就能解决两个查找函数结果重复的问题啦!
备注:内容来源于stack exchange,提问作者Neeks
相关产品推荐
相关产品推荐

