魔术师发牌问题

魔术师发牌问题答案
魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下)。魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止。问原来牌的顺序是如何的。
#include<stdio.h>
#include<stdlib.h>
//建立结点格式
typedef struct _node
{
int date;
struct _node *next;
}Node;
//创建循环链表
Node *create(int n);
//找出魔术师的发牌顺序
void func(Node *head,int n);
//遍历链表输出
void print(Node *head);
//清空链表
void clear(Node *head);
int main()
{
int n;
printf(“请输入魔术师手中的牌数:\n”);
scanf("%d",&n);
Node *head=create(n);
printf(“魔术师手中的牌排列顺序为:\n”);
func(head,n);
print(head);
clear(head);
return 0;
}
//初始化一个长度为13的链表
Node *create(int n)
{
Node *head=NULL;
for(int i=1;i<=n;i++)
{
if(head)
{
Node *p=(Node *)malloc(sizeof(Node));
p->date=0;
p->next=head;
Node last=head;
while(last->next!=head)
{
last=last->next;
}
last->next=p;
}
else
{
head=(Node
)malloc(sizeof(Node));
head->date=0;
head->next=head;
}
}
return head;
}
//魔术师手中牌的顺序
void func(Node *head,int n)
{
Node *p=head;
for(int i=1;i<=n;i++)
{
int j=1;
while(j<i)
{
if(p->date==0)
{
j++;
}
p=p->next;
}
while(p->date!=0)
{
p=p->next;
}
p->date=i;
p=p->next;
}
}
//将循环链表遍历输出
void print(Node *head)
{
Node *p;
for(p=head;p->next!=head;p=p->next)
{
printf("%d->",p->date);
}
printf("%d",p->date);
}
//将循环链表清除
void clear(Node *head)
{
Node *m=head;
Node *p=head;
while(p->next!=m)
{
Node *temp=p;
p=p->next;
free(temp);
}
free §;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值