魔术师发牌问题

共13张黑色桃花牌,翻开第一张为A,从牌堆中移除;过一张牌,这张牌放到牌堆最后,然后翻开第二张为2,从牌堆中移除;过两张牌,这两张牌依次放到牌堆最后,然后翻开第三张为3,从牌堆中移除........
最终,显示的过程就是从A~K。

如何排列13张牌才能形成这个效果?

按照真实情况模拟,13张牌形成一个循环,则使用循环链表最容易达成效果。

1.创建循环列表,头结点也利用上,放A,其他结点放0

typedef struct Node {
    int data;
    struct Node *next;
}Node;

typedef struct Node LinkList;

#define YES 1

#define LINKLIST

#include "LinearList.h"


LinkList *createList(void) {
    // 头结点放1
    Node *head = (Node*)malloc(sizeof(Node));
    head->data = 1;
    head->next = NULL;
    // 创建循环链表,其他位置放0
    Node *current = head;
    for (int i=0; i<12; i++) {
        Node *node = (Node*)malloc(sizeof(Node));
        node->data = 0;
        node->next = NULL;
        current->next = node;
        current = node;
    }
    current->next = head;
    return head;
}

2.赋值其他结点

void insert(LinkList* list) {
    Node *head = list;
    int step = 2;
    Node *current = head;
    // 从头结点出发,要赋值2,则需要next两次。要赋值3,则从赋值2的结点next三次...
    for (int j = step; j<= 13; j++) {
        int i = 0;
        while (inext;
            // 因为有数字的牌在翻出后需要从牌堆中移除,因此这里需要判断如果值为0才算
            if (current->data == 0) {
                i++;
            }
        }
        // 找到后赋值
        current->data = j;
    }
}

3.打印结果

void description(LinkList* list) {
    Node *current = list;
    while (YES) {
        printf("%d->",current->data);
        current = current->next;
        if (current == list) {
            break;
        }
    }
}

最终的结果为1->8->2->5->10->3->12->11->9->4->7->6->13

你可能感兴趣的:(魔术师发牌问题)