问题描述:
魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好,有花色的一面朝下。魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止。
问题:问原来牌的顺序是如何的。
代码实现:
#include
#include
#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(sqlist));
s->data=0;
if(head==NULL)
head=s;
else
r->next=s;
r=s;
}
s->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
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[CardNumber];
int i=0;
while(i
next;
}
for(i=0;i