问题描述:
魔术师手里一共有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; }