魔术师发牌问题

本文介绍了一种基于循环链表解决魔术师发牌问题的算法。通过13次翻牌操作,每次从特定位置取出一张牌并赋予相应数值,实现了牌的有序排列。文章详细展示了算法的实现过程,包括链表初始化、填充数值及最终展示结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

魔术师发牌问题

**核心算法思路:
总共翻牌13次,每次拿出一张牌,链表中一共13个元素
1st:第一个是1 --> 2nd:第三个是2 – > 3rd:第六个是3…


外层循环13次(代码中12次,第一个直接赋值)
内层循环负责向循环链表中填入数值,注意已经赋值的地方需要跳过

**

#include <iostream>
#include <cstdlib>
using namespace std;

const int MaxSize = 13;
typedef int ElemType;
typedef struct CLNode{
	ElemType data;
	struct CLNode *next;
}CLNode,*CLinkList;

CLinkList InitList();
bool ShowList(CLinkList L);
bool MagicCard(CLinkList L);

int main()
{
	CLinkList magiccard = NULL;
	magiccard = InitList();
//	ShowList(magiccard);	//检测产生的链表是否有问题 
	if(MagicCard(magiccard))
	{
		ShowList(magiccard);
		cout << "\nDone.\n";
		return 0;
	}
	cout << "Someting wrong.\n";
	return 0;
}

CLinkList InitList()
{
	CLNode *p = NULL;
	CLNode *head,*temp;
	head = (CLinkList)malloc(sizeof(CLNode));
	if(!head)
	{
		cout << "Initiate Error.\n";
		exit(EXIT_FAILURE);
	}
	p = head;
	for(int i=1; i<=MaxSize; i++){
		temp = (CLinkList)malloc(sizeof(CLNode));
		temp->data = 0;
		p->next = temp;
		p = temp;
	}
	temp->next = head->next;
	delete(head);
	return temp->next;
}

bool MagicCard(CLinkList L)
{
	if(L == NULL)
	{
		cout << "The List is Empty.\n";
		return false;
	}
	CLNode *pwork,*pdel;
	pwork = L;
	pwork->data = 1;
	int count = 2;
	for(int i=1; i<MaxSize; i++){	//从第二个开始,所以少做一次循环
		for(int j=0; j<count; j++){
			pwork = pwork->next;	//顺序和if不能反了
			if(pwork->data !=0)
				j--;
		}
		if(pwork->data == 0)
		{
			pwork->data = count++;
		}
	}
	return true;
}

bool ShowList(CLinkList L)
{
	if(L == NULL)
	{
		cout << "Nothing.\n";
		return false;
	}
	CLNode *pshow = L;
	while(pshow->next != L){
		cout << pshow->data << ' ';
		pshow = pshow->next;
	}
	cout << pshow->data;
	return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值