问题描述:利用13张黑牌,预先将牌摆好后叠放在一起,最上面那张为1,魔术师数1,翻过来是黑桃A,第二次数1,2,翻过来是黑桃2,依次类推,将13张牌全部翻出,准确无误。
问题:最开始牌是怎么排的?
问题:最开始牌是怎么排的?
利用循环链表解决。
#include <stdio.h>
#include<stdlib.h>
#define CardNumber 13
/*定义链表结构*/
typedef struct node
{
int data;
struct node *next;
}sqlist, *linklist;
/*创建循环链表*/
linklist CreateLinkList()
{
linklist head = NULL;
linklist s, r;
int i;
r = head;
for (i = 1; i <= CardNumber; i++)
{
s = (linklist)malloc(sizeof(linklist));
s->data = 0; //初始化内容都为0
if (head == NULL)
head = s;
else
r->next = s;
r = s;
}
r->next = head;
return head;
}
/*放牌顺序计算*/
void Magic(linklist head)
{
linklist p;
int j;
int CountNumber = 2;
p = head;
p->data = 1; //第一张牌放1
while (1)
{
for (j = 0; j < CountNumber; j++)//根据CountNumber,移动指针,依次为2,3...
{
p = p->next;
if (p->data != 0) //该位置如果有牌的话,则下一个位置
{
p->next;
j--;
}
}
if (p->data == 0)
{
p->data = CountNumber;
CountNumber++;
if (CountNumber == 14)
break;
}
}
}
int main()
{
linklist p;
int i;
p = CreateLinkList();
Magic(p);
printf("按如下顺序排序:\n");
for (i = 0; i < CardNumber; i++)
{
printf("黑桃%d\n", p->data);
p = p->next;
}
return 0;
}
运行结果: