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 }
原文:https://www.cnblogs.com/sucker/p/10867092.html