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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 11:19:39