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
相关产品推荐
相关产品推荐

