魔術師撲克牌問題 單迴圈鍊錶

2021-06-18 11:48:06 字數 1407 閱讀 4993

這個程式剛開始寫完的時候爆出了一堆bug。

有幾點要說一下,作為初學者,應該是會不經意間就範的。

1.對迴圈鍊錶的空判斷。

當迴圈鍊錶為空的時候,自身的下一指標指向自身。

2.釋放鍊錶後忘記對最後的指標進行迴圈設定。

#if 0

程式名稱:poker

作用:模擬魔術師發牌

描述:第一張牌為1,第二張牌就要從第二張重新數,為2.第三張就要從四張重新數。

以此類推,大致如下,括號內的值表示位置:

1(1) -> ?(2) -> 2(3) -> ?(4) -> ?(5) -> 3(6).....

#endif

#include #include typedef struct node

node, *linklist;

#if 0

這是注釋,用巨集來寫注釋不會出現巢狀注發布現的錯誤。比如 /*/**/*/ 就會出現錯誤。

名稱:createlist[初始化鍊錶]

呼叫:createlist(linklist l)

作用:生成並初始化13個節點的迴圈鍊錶

引數:linklist l,頭結點

#endif

void createlist(linklist l)

p->data = 0;

r->next = p;

r = p; //尾插法

pokernum--;

} r->next = l; //將尾部的下乙個指標指向頭,形成迴圈鍊錶

}#if 0

名稱:createpork[設定牌序]

呼叫:createpoker(linklist l)

作用:設定牌序,娛樂大眾

#endif

void createpoker(linklist l)

} if(p->data == 0) //當當前節點無值時可以寫入資料}}

}void freelist(linklist l)

l->next=l; //設定頭尾相連,為空表

}void printlist(linklist l)

while (p->next != l) //頭尾相等時,為空表

printf("第 %d 張牌是 %d \n", i, p->data);

}int main()

printf("初始化鍊錶\n");

createlist(l);

printlist(l);

printf("\n\n排序後:\n");

createpoker(l);

printlist(l);

printf("釋放後:\n");

freelist(l);

return 0;

}

魔術師發牌問題(單迴圈鍊錶)

魔術師發牌問題,魔術師拿出13張黑桃撲克牌表演魔術,對底下觀眾講道,我只要數數就知道這張牌是什麼,然後數到1翻出來第一張a,並將a拿出來放到桌子上,用剩下的牌,重新數,數到2拿出來第2張牌.以此內推,求魔術師用怎樣的牌序才能達到此目的。首先分析問題,我們可以得到乙個大致的類似鍊錶牌序為 1 2 3 ...

魔術師發牌問題 迴圈鍊錶

問題描述 魔術師手裡一共有13張牌,全是黑桃,1 13.魔術師需要實現乙個魔術 這是十三張牌全部放在桌面上 正面向下 第一次摸出第一張,是1,翻過來放在桌面上。第二次摸出從上往下數第二張,是2,翻過來 放在桌面上,第一張放在最下面去,等會兒再摸 第三次摸出從上往下數第三張,是3,翻過來放在桌面上,第...

迴圈鍊錶的應用 魔術師發牌問題和拉丁方陣問題

1.魔術師發牌問題 問題描述 魔術師利用一副牌中的13張黑牌,預先將他們排好後疊放在一起,牌面朝下。對觀眾說 我不看牌,只數數就可以猜到每張牌是什麼,我大聲數數,你們聽,不信?現場演示。魔術師將最上面的那張牌數為1,把他翻過來正好是黑桃a,將黑桃a放在桌子上,第二次數1,2,將第一張牌放在這些牌的下...