静态链表+魔术师发牌问题

一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;
魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。
求解:魔术师手中牌的原始顺序是什么样子的

#include<iostream>
using namespace std;
#include<ctime>
//循环链表
//魔术师发牌问题
//创建结构体
typedef struct Pnode
{
	int data;
	Pnode *next;
}*linklist;
void creatlist(linklist &L, int n)
{
	linklist head, temp;
	head = (linklist)malloc(sizeof(Pnode));//创建头指针
	head->next = L;
	int i = 1;
	if (n > 0)
	{
		L->data =14;//初始的数值都给14
		L->next = NULL;//给第一个结点赋值
		temp = L;
		for ( i = 1; i < n; i++)
		{
			linklist p = (linklist)malloc(sizeof(Pnode));
			p->data =14;
			temp->next = p;
			p->next = NULL;
			temp = p;
		}
		temp->next = L;//尾结点指向头结点
		free(head);//释放head
	}
	else
	{
		cout << "error to input" << endl;
	}
}
void print(linklist &L,int n)
{
	linklist p=L,k=L;
	for (int i = 0; i < n; i++)
	{
		cout <<p->data << " ";
		p = p->next;
	}
	cout << endl;
}
int main()
{
	srand((unsigned int)time(NULL));
	linklist L=(linklist)malloc(sizeof(Pnode));
	creatlist(L, 13);
	linklist p = L;//关于为什么在操作链表的时候都要把链表赋值给另一个结点是因为在操作链表后悔改变链表次序,赋值给另一个结点可以用哪个结点遍历操作链表元素
	print(L, 13);
	int num=1;
	//p->data = 1;
	//p = p->next;
	//p->data = 2;
	//print(L, 13);
	while (num!=14)
	{
		for (int j = 0; j < num; j++)
		{
			if (p->data != 14)
			{
				while (p->data != 14)//跳过已经付过值的元素
				{
					p = p->next;
				}
			}
			else
			{
				if (j != num - 1)//在for循环最后一次跳出
				{
					p = p->next;
				}
			}
		}
		p->data = num;
		p = p->next;
		num++;
	}
	print(L, 13);
	system("pause");
	return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值