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

C语言遍历链表验证扑克牌手牌是否为皇家同花顺的实现问题

现有代码问题修正

你写的suitCheck函数存在空指针访问风险:语法上tmp->next->suit可以被编译器正常识别,但运行时会触发崩溃。当遍历到链表最后一个节点时,tmp不为NULL但tmp->next是NULL,此时访问tmp->next->suit属于非法内存访问。

修正后的suitCheck逻辑如下:

int suitCheck(card* pHand) {
    // 单张/空手牌直接不符合花色一致要求
    if (pHand == NULL || pHand->next == NULL) return 0;
    card* tmp = pHand;
    // 遍历到倒数第二个节点就停止,避免访问空指针
    while (tmp->next != NULL) {
        if (tmp->suit != tmp->next->suit) {
            return 0;
        }
        tmp = tmp->next;
    }
    return 1;
}

皇家同花顺面值校验实现

你可以用一次遍历统计所有目标面值是否存在,不需要多次遍历链表,效率更高。皇家同花顺要求必须同时存在10、J(11)、Q(12)、K(13)、A(注意A的面值通常定义为1或者14,可根据你的结构体定义调整),实现代码如下:

int royalFlush(card* pHand) {
    // 先校验花色是否统一
    if (!suitCheck(pHand)) {
        return 0;
    }
    // 初始化标记位,记录对应面值是否存在
    int has10 = 0, hasJ = 0, hasQ = 0, hasK = 0, hasA = 0;
    card* temp = pHand;
    while (temp != NULL) {
        switch(temp->face) {
            // 若你的项目中A面值定义为14,将此处case 1改为case 14即可
            case 1:
                hasA = 1;
                break;
            case 10:
                has10 = 1;
                break;
            case 11:
                hasJ = 1;
                break;
            case 12:
                hasQ = 1;
                break;
            case 13:
                hasK = 1;
                break;
            // 出现其他面值直接不符合要求,提前返回
            default:
                return 0;
        }
        temp = temp->next;
    }
    // 所有目标面值都存在则返回1
    return (has10 && hasJ && hasQ && hasK && hasA);
}

补充:如果要严格按照你原本的“先查K再依次查其他面值”的思路实现,只需要封装一个checkFaceExist函数,每次遍历链表判断指定面值是否存在即可,不过多次遍历的效率会低于上面的一次遍历统计方案。

内容的提问来源于stack exchange,提问作者checknodes43434

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:45:03