共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 (i<j) {
current = current->next;
// 因为有数字的牌在翻出后需要从牌堆中移除,因此这里需要判断如果值为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
。