链表的学习(2)
程序员文章站
2024-03-06 20:15:32
...
魔术师发牌问题: 魔术师手中有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 remedy
{
int a;
struct remedy *link;
}NODE;
NODE *createlink();
void Magician(NODE *head);
int main()
{
NODE *head;
head=createlink();
Magician(head);
int i;
for(i=0;i<13;i++)
{
head=head->link;
printf("%d ",head->a);
}
return 0;
}
NODE *createlink()
{
NODE *head;
head=(NODE *)malloc(sizeof(NODE));
head->link=NULL;
NODE *p,*s;
int i;
p=head;
for(i=0;i<13;i++)
{
s=(NODE *)malloc(sizeof(NODE));
s->a=0;
p->link=s;
p=s;
}
p->link=head->link;
return head;
}
void Magician(NODE *head)
{
int n,i;
n=2;
NODE *p;
p=head->link;
p->a=1;
while(1)
{
for(i=0;i<n;i++)
{
p=p->link;
if(p->a!=0)//不等于0,即有牌占了,继续往下找,前面找的那次不算,所以i--
{
i--;
}
}
if(p->a==0)
{
p->a=n;
n++;
if(n==14)
break;
}
}
}