检查链表中的每个节点是不是存在 c 中的条件

Posted

技术标签:

【中文标题】检查链表中的每个节点是不是存在 c 中的条件【英文标题】:checking every node in a linked list for a condition in c检查链表中的每个节点是否存在 c 中的条件 【发布时间】:2022-01-07 17:01:00 【问题描述】:

所以我有一个链接列表,用于表示一手五张扑克牌。我正在尝试编写一个函数来检查卡片是否是皇家同花顺。我要做的第一件事是检查所有卡片的花色是否相同。下一点是我遇到麻烦的地方。我的想法是我会检查是否有任何牌是国王(13)。如果有一张,那么它会再次检查列表中是否有 Q、J、A 和 10,如果在任何时候没有找到一张牌,它返回 0。如果所有牌都在那里并且他们有同样的西装,函数返回 1。这是我目前所得到的:

int royalFlush(card* pHand) 
    card* temp = pHand;

    if (!suitCheck(temp)) 
        return 0;
    

    else 
        while (temp != NULL) 
            //check if the card has the right face here
            temp = temp->next;
        
    
 

int suitCheck(card* pHand) 
    card* tmp;
    tmp = pHand;
    while (tmp != NULL) 
        if (tmp->suit != tmp->next->suit) 
            return(0);
        
        tmp = tmp->next;
    
    return(1);

我无法弄清楚如何从一张卡片移动到另一张卡片并检查每张卡片的正面是否具有正确的值。我也不确定这是否:tmp->next->suit 是编译器可以正确读取的东西。

【问题讨论】:

是的,tmp->next->suit 是编译器可以理解的。但如果你要这样做,循环应该是while (tmp != NULL && tmp->next != NULL) 另一种方法是保存第一张牌的花色,例如int suit = pHand->suit; 然后检查每张卡片是否与该花色匹配。 手的花色都一样吗?这是第一步。如果您可以验证,请检查它是否包含必要的面卡。如果您知道它们都是相同的花色,您就不必担心找到两张任何面卡:例如。两个杰克,或两个皇后。 为了帮助您(和其他人)阅读您的代码,建议您为函数指定一个特定于它们所做工作的名称(通常是涉及动词的名称)。例如,suitCheck does “检查”适合,但不清楚 什么 类型的检查。像isSameSuit 这样的名字会更有意义。 您可以考虑使用的一种非常幼稚的方法是只计算一手牌中每种花色和价值的数量。这对于其他事情也将更加通用。因此,值的数组长度为 13,西装的数组长度为 4。然后,您遍历列表并增加相关的花色和价值计数器。现在很容易检查所有必需的卡都在那里。 ace 中只有一个“1”,10、J、Q、K 计数和其中一个花色计数中的 5。假设手中有 5 张牌。在这方面,将手表示为链表是很奇怪的。 【参考方案1】:

欢迎来到 SO!希望您在这里过得愉快。

如果你能够稍微修改函数签名,你可以这样做:

int suitCheck(card *pHand, suit expected_suite)

  if(pHand == NULL) 
    return 0; /* You can remove this if you're absolutely sure the initial next of the original pHand is not NULL */
  
  while(pHand) 
    if(pHand->suite != expected_suite) 
      return 0;
    
  
  return 1;

然后你会像这样从主代码中调用它:

if(suitCheck(temp->next, temp->suite)) 

我会让你想象如何在不修改函数签名的情况下完成同样的壮举。

【讨论】:

【参考方案2】:

假设卡片按花色和降序排序,

    如果手是空的,
      返回 false。
    得到第一张牌的花色。 创建数组 [Ace、King、Queen、Jack、10]。 将i 设置为数组第一个元素的索引。 将当前卡片设置为第一张卡片。 虽然当前卡片不是空的并且i 在数组的范围内,
      如果当前牌的花色与第一张牌的花色不匹配,
        返回 false。
      如果当前卡片的排名与索引i对应的排名不匹配,
        返回 false。
      递增i。 将当前卡片设为以下卡片。
    返回真。

请注意,如果将一个非常奇怪的结构用于纸牌游戏,则使用链表。

【讨论】:

以上是关于检查链表中的每个节点是不是存在 c 中的条件的主要内容,如果未能解决你的问题,请参考以下文章

C语言链表中的节点

如何从c中的双向链表中删除节点

LeetCode83. 删除排序链表中的重复元素

83. 删除排序链表中的重复元素

C和C指针小记(十七)-使用结构和指针

Leetcode——重排链表