欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

链表的学习(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;
        }
    }
}