数据结构-魔术师发牌问题

 1 /*
 2  魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好
 3  (有花色的一面朝下)。魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后
 4  将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2
 5  ;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……
 6  直到将所有的牌都翻出来为止。问原来牌的顺序是如何的。
 7 
 8 */ 
 9 #include"stdio.h"
10 #include"stdlib.h"
11 #define N 13 
12 typedef struct node{
13     int num;
14     int password;
15     struct node *prior,*next;
16 }LinkNode;
17 //创建一个大小为 
18 LinkNode* creatList()
19 {
20     LinkNode *head = (LinkNode*)malloc(sizeof(LinkNode));
21     LinkNode *p = head;
22     LinkNode *s;
23     int i = 0;
24     while(i < N)
25     {
26         s = (LinkNode*)malloc(sizeof(LinkNode));
27         s->num = 0;
28         p->next = s;
29         s->prior = p;
30         p = s; 
31         i++; 
32     }
33     s->next = head->next;
34     head->next->prior = s;
35     free(head);
36     return s->next;
37 }    
38 main()
39 {
40     LinkNode *head;
41     LinkNode *q;
42     head = creatList();
43     LinkNode *p = head;
44     p->num = 1;//第一张牌放1 
45     int countNumber = 2;
46     while(countNumber < 14)//当排大于等于14时排就发完了 最大的排为13(K) 
47     {
48         for(int i=0; i<countNumber; i++)//这里代表的是我们要数到几就要进行几次循环 
49         {
50             p = p->next;
51             if(p->num != 0)//如果当前的数不是0的话代表已经被拿出来了 
52             {
53                 i--;
54             } 
55         }
56         if(p->num == 0)
57         {
58             p->num = countNumber;
59             countNumber++;
60         }
61     }
62     int sign = 1;
63     p = head;
64     while(p != head || sign)
65     {
66         if(sign)
67         {
68             sign = 0;
69         }
70         printf("%d\t",p->num);
71         p = p->next;
72     }
73 }

猜你喜欢

转载自www.cnblogs.com/sucker/p/10867092.html