您的位置:首页 > 理论基础 > 数据结构算法

数据结构--循环链表,魔术师发牌问题

2017-07-18 09:22 260 查看
问题描述:利用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;
}
运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: