魔術師發牌問題+迴圈連結串列
阿新 • • 發佈:2021-02-05
技術標籤:資料結構
問題
- 魔術師發牌問題的簡介:一位魔術師掏出一疊撲克牌,魔術師取出其中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;
}