C语言链表节点搜索代码故障排查与修正求助
解决链表节点搜索始终返回"No"的问题
嘿,我看到你在C语言链表的节点搜索上卡壳了,每次都得到"No"的结果,咱们来一步步揪出问题并解决它。
核心问题:搜索函数的判断逻辑写错了
你的searchNode函数里的判断条件犯了个低级错误:
if (temp->data, x == 0)
这里用了逗号运算符,它的规则是依次执行两个表达式,最终返回最后一个表达式的结果。也就是说这个条件等价于if (x == 0)——只有当你要搜索的数值是0时才会返回节点,其他情况都会遍历到链表末尾返回NULL,这就是为什么你永远得到"No"的原因。
正确的逻辑应该是判断当前节点的data是否等于目标值x,改成下面这样就对了:
if (temp->data == x)
次要bug:insertLastNode函数的逻辑错误(影响链表构建)
虽然这不是直接导致搜索失败的原因,但你的insertLastNode函数存在逻辑漏洞,会导致无法正确插入后续节点:
if (newNode->link == NULL) { num->head = newNode; return; }
你刚把newNode->link赋值为NULL,这个条件永远为真,所以不管链表有没有节点,每次调用insertLastNode都会把新节点设为head,直接覆盖之前的节点。正确的判断应该是检查链表的head是否为空:
if (num->head == NULL) { num->head = newNode; return; }
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ListNode { int data; struct ListNode* link; }listNode; typedef struct { listNode* head; } linkedList_h; listNode* searchNode(linkedList_h* DL, int x) { listNode* temp; temp = DL->head; while (temp != NULL) { // 修正判断条件:比较节点data和目标值x if (temp->data == x) { return temp; } else { temp = temp->link; } } return temp; } void insertFirstListNode(linkedList_h* num, int data) { listNode* newNode = (listNode*)malloc(sizeof(listNode)); newNode->link = num->head; newNode->data = data; num->head = newNode; } void insertLastNode(linkedList_h* num, int data) { listNode* newNode; listNode* temp; newNode = (listNode*)malloc(sizeof(listNode)); newNode->data = data; newNode->link = NULL; // 修正判断条件:检查链表是否为空 if (num->head == NULL) { num->head = newNode; return; } temp = num->head; while (temp->link != NULL) temp = temp->link; temp->link = newNode; } linkedList_h* createLinkedList_h() { linkedList_h* Newlist = (linkedList_h*)malloc(sizeof(linkedList_h)); Newlist->head = NULL; return Newlist; } void printList(linkedList_h* L) { listNode* p; printf("L = ("); p = L->head; while (p != NULL) { printf("%d", p->data); p = p->link; if (p != NULL) printf(", "); } printf(") \n"); } int main() { int i, j = 0; int k; int o = 0; linkedList_h* m; m = createLinkedList_h(); insertLastNode(m, 4); printList(m); printf("size input\n"); scanf_s("%d", &i); printf("%d\n", i); for (j = 0; j < i; j++) { printf("input \n"); scanf_s("%d", &k); insertFirstListNode(m, k); } printList(m); printf("Find Nodes : "); scanf_s("%d", &o); printf("your Nodes : %d\n", o); searchNode(m, o) ? printf("yes") : printf("no"); return 0; }
测试验证
比如你先插入4,然后输入size为2,分别插入5和6,链表会变成(6, 5, 4)。当你搜索5的时候,函数会正确找到节点并返回,输出"yes";搜索不存在的7则输出"no",完全符合预期。
内容的提问来源于stack exchange,提问作者Kihyeon Kim
相关产品推荐
相关产品推荐

