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 }