魔术师发牌问题
**核心算法思路:
总共翻牌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;
}