单链表中返回指定节点前驱节点的C语言实现错误求助
单链表前驱查找函数bug修复
错误根因
- 空指针访问漏洞:代码中先执行了
struct node *current_node = l->head;访问链表结构体的头节点成员,之后才判断l == NULL的非法输入场景,如果传入的l是空指针,第一行代码就会触发段错误,后续的空指针校验完全不生效。
修复后代码
/* 返回单链表L中节点N的前驱节点指针;如果N是链表第一个节点或者N不在链表中,返回NULL */ struct node *list_prev(struct list *l, struct node *n) { // 优先完成所有参数合法性校验,再操作指针访问成员 if (l == NULL || n == NULL || l->head == NULL || n == l->head) return NULL; struct node *current_node = l->head; while (current_node->next != NULL) { if (current_node->next == n) { return current_node; } current_node = current_node->next; } return NULL; }
逻辑说明
修复后保留了原有正确的遍历逻辑:从链表头节点开始遍历,每次判断当前节点的后继是否是目标节点,匹配则直接返回当前节点;遍历到链表尾仍未匹配则返回NULL,完全符合需求定义。
内容的提问来源于stack exchange,提问作者Rasheed Nesbitt
相关产品推荐
相关产品推荐

