魔术师发牌问题

来源:互联网 发布:php变量的作用域 编辑:程序博客网 时间:2024/04/26 19:17
#include <stdio.h>#include <stdlib.h>#define CardNumber 13/*魔术师利用一副牌中的13张黑牌,预先将他们拍好后叠在一起,牌面朝下对观众说:“我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示”。魔术师将最上面的那张牌数为1,把他翻过来正好是黑桃A,将黑桃A放在桌子上,第二次数1,2将第一张牌放在这些牌的下面,将第二张牌翻过来,正好是黑桃2,也将放在桌子上这样一次进行将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=0;i<=CardNumber;i++)    {        s=(linklist)malloc(sizeof(sqlist));        s->data=0;        if(head==NULL)            head=s;        else            r->next=s;        r=s;    }    r->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<Countnumber;j++)        {            p=p->next;            if(p->data!=0)            {                p=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<CardNumber)    {        buff[i++]=ptr;        ptr=ptr->next;    }    for(i=0;i<CardNumber;++i)        free(buff[i]);    *list=0;}int main(){    linklist p;    int i;    p=CreateLinkList();    Magician(p);    printf("按如下顺序排列:\n");    for(i=0;i<CardNumber;i++)    {        printf("黑桃%d\n",p->data);        p=p->next;    }    DestoryList(p);    return 0;}

0 0