魔术师发牌问题+循环链表

问题

  • 魔术师发牌问题的简介:一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。求解:魔术师手中牌的原始顺序是什么样子的?

代码

#include<stdio.h>
#include<stdlib.h>

#define cardNumber 13

typedef struct node{
    int data;
    struct node * next;
}node,*linklist;

void func(linklist* l){
    int cardCount = 0;
    /*初始化循环链表*/
    int i,j;
    linklist s,t;
    // 第一张牌
    t = (linklist)malloc(sizeof(node));
    t->data = 0;
    t->next = NULL;
    (*l) = t;
    s = t;
    for(i=1;i<cardNumber;i++){
        t = (linklist)malloc(sizeof(node));
        t->data = 0;
        s->next = t;
        s = t;
    }
    s->next = (*l);
    
    
    // 核心
    s = (*l);
    for(i=1;i<=13;i++){
        j=1;
        while(j<i){
            if(s->data==0){
                j++;
            }
            s = s->next;
        }
        /*跳过有牌的*/
        while(s->data!=0){
        	s=s->next;
		} 
        s->data = i;
    }
    // 展示
    printf("发牌顺序为:");
    s = (*l);
    for(i=1;i<=cardNumber;i++){
        printf("%d  ",s->data);
        s= s->next;
    }
    printf("\n");
    /*销毁链表结构*/
    s = (*l);
    t = s; 
    for(i=1;i<=cardNumber;i++){
    	s = s->next;
    	free(t);
    	t = s;
	} 
}


int main(){
    linklist l;
    func(&l);

    return 0;
}

运行效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值