C语言实现含重复data1的双数据字段链表最小节点查找
核心实现思路
按照约定的优先级规则遍历链表即可,优先级判断逻辑为:
- 优先比较
data1字段,取值更小的节点优先级更高 - 若两个节点的
data1取值相等,再比较data2字段,取值更小的节点优先级更高
遍历全程维护一个指向当前最高优先级节点的指针,遍历完成后直接返回该指针即可。
边界场景处理
- 若传入的链表头指针
head为空(即空链表),直接返回NULL,避免触发空指针访问错误 - 初始化时将链表第一个节点设置为初始最高优先级节点,从第二个节点开始依次遍历对比
完整实现代码
#include <stddef.h> // 引入NULL宏的标准头文件 struct Node { int data1; int data2; struct Node* next; }; // 纯C环境下需显式使用struct Node作为类型标识,避免编译错误 struct Node *find_min(struct Node *head) { // 空链表直接返回 if (head == NULL) { return NULL; } // 初始化最小候选节点、独立遍历指针 struct Node *min_node = head; struct Node *cursor = head->next; while (cursor != NULL) { // 按优先级规则判断是否需要更新候选节点 if (cursor->data1 < min_node->data1) { min_node = cursor; } else if (cursor->data1 == min_node->data1 && cursor->data2 < min_node->data2) { min_node = cursor; } // 移动遍历指针到下一个节点 cursor = cursor->next; } return min_node; }
注意:你最初写的函数声明为
Node *find_min(Node *head),在纯C编译环境下会因为类型未定义报错;如果之前通过typedef struct Node Node;做了类型别名声明,原写法可正常编译运行。
新手易踩坑提醒
- 不要直接用传入的
head指针做遍历移动,必须使用独立的遍历指针操作,避免指针位置偏移后丢失初始链表头的位置 - 对比逻辑严格按照优先级顺序编写,不能在
data1还未分出大小的阶段就提前对比data2,否则会出现判断逻辑错误 - 空链表的判断必须放在函数最开头,否则后续访问
head->next会直接触发内存访问异常,导致程序崩溃
内容的提问来源于stack exchange,提问作者pickle san
相关产品推荐
相关产品推荐

