魔术师发牌问题

一、问题描述

魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下)。魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止。问原来牌的顺序是如何的?

二、程序代码

#include<stdio.h>
#include<stdlib.h>
#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;
    }
    r->next=head;
    return head;
}





//销毁工作
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;
}


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->next;
                j--;
            }
        }
       if(p->data == 0)
        {
            p->data = Countnumber;
            Countnumber++;
            if (Countnumber == 14)
            {
                break;
            }

        }

    }
}


int main()
{    
    linklist p;
    int i;

    p=CreateLinkList();
    Magician(p);

    printf("按如下顺序排列:
");
    for(i=0;i<CardNumber;i++)
    {
        printf("黑桃%d",p->data);
        p=p->next;
    }
    printf("
");
    DestoryList(&p);
    return 0;
}
View Code

三、程序运行结果

原文地址:https://www.cnblogs.com/wutao666/p/9688283.html