魔术师发牌问题

问题描述:

魔术师手中有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
       
       
      
      
     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值