魔术师发牌问题

来源:互联网 发布:新开的淘宝店怎么刷钻 编辑:程序博客网 时间:2024/04/26 06:36

问题描述:

魔术师手中有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;jnext;            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(inext;    }    for(i=0;idata);        p=p->next;    }    printf("\n");    DestoryList(&p);    return 0;}