魔术师发牌问题

 魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下)。魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止。问原来牌的顺序是如何的。

#include <iostream>
#include <cstdio>
#include<cstdlib>

#define CardCount 13

typedef struct node
{
	int data;
	struct  node *next;
}sqlist, *linklist;
//创建单链表
linklist CreateLinkList()
{
	linklist head = NULL;
	linklist s;
	linklist r;
	int i;

	r = head;

	for (i = 1; i <= CardCount; i++)
	{
		s = (linklist)malloc(sizeof(sqlist));
		s->data = 0;

		if (head = NULL)
		{
			head = s;
		}
		else
		{
			r->next = s;
		}
		r = s;
	}
	r->next = head;
	return head;
}
void Magician(linklist head)
{
	linklist p;
	int j;
	int Countnumber = 2;

	p = head;
	p->data = 1;

	while (1)
	{
		for (j = 0; j < Countnumber; j++)
		{
			p = p->next;
			if (p->data != 0)
			{
				p->next;
				j--;
			}

		}
		if (p->data == 0)
		{
			p->data = Countnumber;
			Countnumber++;
			if (Countnumber == 14)
			{
				break;
			}

		}
	}
}

//销毁链表
void DestoryList(linklist *list)
{
	linklist ptr = *list;
	linklist buff[CardCount];
	int i = 0;

	while (i<CardCount)
	{
		buff[i++] = ptr;
		ptr = ptr->next;
	}
	for (i = 0; i < CardCount; ++i)
	{
		free(buff[i]);
	}
	*list = 0;
}

int main()
{
	linklist p;
	int i;

	p = CreateLinkList();
	Magician(p);

	printf("发牌顺序如下:\n");
	for (i = 0; i < CardCount; i++)
	{
		printf("黑桃%d", p->data);
		p = p->next;
	}

	DestoryList(&p);

	return 0;

}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值