魔术师发牌问题(循环链表)
问题描述:
魔术师手里一共有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的世界是简单的

浙公网安备 33010602011771号