魔术师发牌问题(循环链表)

问题描述:
魔术师手里一共有13张牌,全是黑桃,1~13.
魔术师需要实现一个魔术:这是十三张牌全部放在桌面上(正面向下),
第一次摸出第一张,是1,翻过来放在桌面上。
第二次摸出从上往下数第二张,是2,翻过来 放在桌面上,(第一张放在最下面去,等会儿再摸),
第三次摸出从上往下数第三张,是3,翻过来放在桌面上,(第一张和第二张 放在最下面去,等会儿再摸)
以此类推 最后一张就是13

#include <iostream>
#include <malloc.h>

using namespace std;


typedef struct Node
{
    int num;//牌号
    struct Node *next;
}Node;


Node *Create(int n)
{
    Node *p,*q,*h=NULL;
    int i;
    for(i=1;i<=n;i++)
    {
        p=(Node*)malloc(sizeof(Node));
        p->num=0;//初始化为零
        if(h==NULL) h=p;
        else q->next=p;
        q=p;p->next=NULL;
    }
    p->next=h;
    h=p;
    return(h);//h为循环链表尾指针
}


int Display(Node * h)
{
    Node * p=h->next;
    int i;
    i=(h->next==h)?0:1;//判断是否循环链表中只有一个元素
    cout<<p->num<<endl;
    p=p->next;
    while(p!=h)
    {
         cout<<p->num<<endl;
         p=p->next;
    }
    if(i) cout<<h->num<<endl;
    return 0;
}


int Magician(Node *H,int m)//m为牌的数目
{
    int i=1,j;
    Node *q,*p=H;
    for(i=1;i<=m;i++)
    {
        for(j=0;j<i-1;j++)//p每次指向带插入位置的前一个位置
        {
            p=p->next;
            while(p->num)//已填入元素,可以当成已从链表中删去
            {
                p=p->next;
            }

        }
        q=p->next;
        while(q->num)//已填入元素,可以当成已从链表中删去
        {
            q=q->next;
        }
        q->num=i;
        p=q;
    }
    return 0;
}

int main()
{
    Node *H;
    H=Create(13);
    Magician(H,13);
    Display(H);
    return 0;
}

  

只有0和1的世界是简单的
原文地址:https://www.cnblogs.com/nullxjx/p/5954106.html