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

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

技術標籤:資料結構

問題

  • 魔術師發牌問題的簡介:一位魔術師掏出一疊撲克牌,魔術師取出其中13張黑桃,洗好後,把牌面朝下。說:“我不看牌,只數一數就能知道每張牌是什麼?”魔術師口中念一,將第一張牌翻過來看正好是A;魔術師將黑桃A放到桌上,繼續數手裡的餘牌,第二次數1,2,將第一張牌放到這疊牌的下面,將第二張牌翻開,正好是黑桃2,也把它放在桌子上。第三次數1,2,3,前面二張牌放到這疊牌的下面,取出第三張牌,正好是黑桃3,這樣依次將13張牌翻出,全部都準確無誤。求解:魔術師手中牌的原始順序是什麼樣子的?

程式碼

#include<stdio.h>
#include<stdlib.h>
#define cardNumber 13 typedef struct node{ int data; struct node * next; }node,*linklist; void func(linklist* l){ int cardCount = 0; /*初始化迴圈連結串列*/ int i,j; linklist s,t; // 第一張牌 t = (linklist)malloc(sizeof(node)); t->data = 0; t->next = NULL; (*l) = t;
s = t; for(i=1;i<cardNumber;i++){ t = (linklist)malloc(sizeof(node)); t->data = 0; s->next = t; s = t; } s->next = (*l); // 核心 s = (*l); for(i=1;i<=13;i++){ j=1; while(j<i){ if(s->data==
0){ j++; } s = s->next; } /*跳過有牌的*/ while(s->data!=0){ s=s->next; } s->data = i; } // 展示 printf("發牌順序為:"); s = (*l); for(i=1;i<=cardNumber;i++){ printf("%d ",s->data); s= s->next; } printf("\n"); /*銷燬連結串列結構*/ s = (*l); t = s; for(i=1;i<=cardNumber;i++){ s = s->next; free(t); t = s; } } int main(){ linklist l; func(&l); return 0; }

執行效果

在這裡插入圖片描述