You need to enable JavaScript to run this app. C语言实现含重复data1的双数据字段链表最小节点查找
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 06:24:03