美文网首页
2020-08-21[单循环链表解决魔术师发牌问题]

2020-08-21[单循环链表解决魔术师发牌问题]

作者: 金珉锡_4bc1 | 来源:发表于2020-08-21 11:30 被阅读0次
#include <stdio.h>
#include <stdlib.h>

/**
    单循环链表解决魔术师发牌问题
    */

#define CardNumber 13

typedef struct Node
{
    int data;
    struct Node *Next;
} List;
typedef struct Node* LinkList;

// 创建一个数据域全为0的包含13个元素的单循环链表
void CreateLinkList(LinkList *L)
{
    *L = (LinkList)malloc(sizeof(List));
    LinkList pHead = *L;
    for(int i = 1; i <= CardNumber; i++){
        LinkList pNew = (LinkList)malloc(sizeof(List));
        pNew->data = 0;
        pHead->Next = pNew;
        pHead = pNew;
    }
    pHead->Next = (*L)->Next;
}

// 打印链表
void PrintLinkList(LinkList L)
{
    LinkList p = L->Next;

    while(p->Next != L->Next){
        printf("%d ", p->data);
        p = p->Next;
    }
    printf("%d ", p->data);
    printf("\n");
}

// 魔术师问题算法
// 解决思路:给13张牌赋值,如果遇到已经赋值过的,则跳过,直到13张牌全部赋值完毕结束
void Magician(LinkList *L)
{
    int CountNumber = 2;
    LinkList p = (*L)->Next; // 取第一张牌
    p->data = 1;             // 把1给了他

    while(1){
            // 找第CountNumber张牌
        for(int i = 0; i < CountNumber; i++){
            p = p->Next;
            // 如果翻到的牌有值,则跳过此牌
            if(p->data != 0){
                i--;
            }
        }

        // 如果找到了且牌上无值,则给这张牌赋值
        if(p->data == 0){
            p->data = CountNumber;
            CountNumber++;
            // 如果13张全部赋值,则退出
            if(CountNumber == 14){
                break;
            }
        }
    }
}

int main()
{
    LinkList LL;
    CreateLinkList(&LL);
    Magician(&LL);
    PrintLinkList(LL);
    return 0;
}

相关文章

  • 2020-08-21[单循环链表解决魔术师发牌问题]

  • 魔术师发牌问题

      一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌...

  • 魔术师发牌问题

    问题描述 魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下,对观众说:“我不看牌,只数数就可以...

  • 魔术师发牌问题

    共13张黑色桃花牌,翻开第一张为A,从牌堆中移除;过一张牌,这张牌放到牌堆最后,然后翻开第二张为2,从牌堆中移除;...

  • 线性表存储结构

    数组实现 结构体实现 带头结点的单循环链表 带头结点的双循环链表 带头结点 带头结点的单循环链表和双循环链表 不管...

  • Java 魔术师发牌

    前天学习数据结构的时候,在循环链表时,案例是魔术师发牌,看到用C实现,用到了指针,今天无聊的时候,就用Java实现...

  • 约瑟夫问题、魔术师发牌问题

    据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的...

  • 魔术师发牌问题 -- python实现

    问题描述 魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好...

  • 单循环链表

    单循环链表:将单链表中终端结点的next域由空指针改为指向头结点,就使得整个单链表形成一个环,这种头尾相接的单链表...

  • lordrunner需要考虑的问题

    1、单用户单循环susi,解决关联问题 2、单用户多循环,参数化脚本,验证参数化问题sumi 3、多用户单循环mu...

网友评论

      本文标题:2020-08-21[单循环链表解决魔术师发牌问题]

      本文链接:https://www.haomeiwen.com/subject/amlujktx.html