1. 程式人生 > >魔術師發牌問題(迴圈連結串列)

魔術師發牌問題(迴圈連結串列)

問題描寫敘述:

       魔術師手中有A、2、3……J、Q、K十三張黑桃撲克牌。在表演魔術前,魔術師已經將他們依照一定的順序疊放好(有花色的一面朝下)。魔術表演過程為:一開始,魔術師數1,然後把最上面的那張牌翻過來,是黑桃A;然後將其放到桌面上;第二次,魔術師數1、2;將第一張牌放到這些牌的最以下,將第二張牌翻轉過來,正好是黑桃2;第三次,魔術師數1、2、3;將第1、2張牌依次放到這些牌的最以下,將第三張牌翻過來正好是黑桃3;……直到將全部的牌都翻出來為止。問原來牌的順序是怎樣的。

 1 #include<stdio.h>
 2
#include<stdlib.h> 3 #define Carnumber 13 4 5 typedef struct Node{ 6 int data; 7 struct Node *next; 8 }Node,*linklist; 9 10 //初始化 11 int InitList(linklist &head){ 12 head = (linklist)malloc(sizeof(Node)); 13 if(!head) 14 return 0; 15 head->next = NULL;
16 return 0; 17 } 18 19 //建立 20 linklist CreatLinkList(linklist &head){ 21 linklist s,r; 22 r = head; 23 for(int i = 1; i <= Carnumber; i++){ 24 s = (linklist)malloc(sizeof(Node)); 25 s->data = 0;//連結串列初始化0,開始時候不存撲克牌內容 26 r->next = s; 27 r = s;
28 } 29 r->next = NULL; 30 s->next = head->next;//尾部指向head,構成單迴圈連結串列 31 return s->next; 32 } 33 34 //發牌順序計算 35 void Magician(linklist &head){ 36 linklist p; 37 int j; 38 int Countnumber = 2; 39 p = head; 40 p->data = 1;//第一張牌放1 41 while(1){ 42 for(j = 0; j < Countnumber; j++){ 43 p = p->next; 44 if(p->data != 0){//如果該位置有牌,則下一個 45 p->next; 46 j--; 47 } 48 } 49 if(p->data == 0){ 50 p->data = Countnumber; 51 Countnumber++; 52 if(Countnumber == 14) 53 break; 54 } 55 } 56 } 57 58 59 int main(){ 60 linklist head; 61 InitList(head); 62 linklist p; 63 int i; 64 p = CreatLinkList(head); 65 Magician(p); 66 printf("按如下順序排列:\n"); 67 for(i = 0; i < Carnumber; i++){ 68 printf("黑桃%d ",p->data); 69 p = p->next; 70 } 71 return 0; 72 }

執行結果: