#include <stdio.h>
#include <stdlib.h>
/**
單循環(huán)鏈表解決魔術(shù)師發(fā)牌問題
*/
#define CardNumber 13
typedef struct Node
{
int data;
struct Node *Next;
} List;
typedef struct Node* LinkList;
// 創(chuàng)建一個(gè)數(shù)據(jù)域全為0的包含13個(gè)元素的單循環(huán)鏈表
void CreateLinkList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(List));
LinkList pHead = *L;
for(int i = 1; i <= CardNumber; i++){
LinkList pNew = (LinkList)malloc(sizeof(List));
pNew->data = 0;
pHead->Next = pNew;
pHead = pNew;
}
pHead->Next = (*L)->Next;
}
// 打印鏈表
void PrintLinkList(LinkList L)
{
LinkList p = L->Next;
while(p->Next != L->Next){
printf("%d ", p->data);
p = p->Next;
}
printf("%d ", p->data);
printf("\n");
}
// 魔術(shù)師問題算法
// 解決思路:給13張牌賦值,如果遇到已經(jīng)賦值過的,則跳過,直到13張牌全部賦值完畢結(jié)束
void Magician(LinkList *L)
{
int CountNumber = 2;
LinkList p = (*L)->Next; // 取第一張牌
p->data = 1; // 把1給了他
while(1){
// 找第CountNumber張牌
for(int i = 0; i < CountNumber; i++){
p = p->Next;
// 如果翻到的牌有值,則跳過此牌
if(p->data != 0){
i--;
}
}
// 如果找到了且牌上無值,則給這張牌賦值
if(p->data == 0){
p->data = CountNumber;
CountNumber++;
// 如果13張全部賦值,則退出
if(CountNumber == 14){
break;
}
}
}
}
int main()
{
LinkList LL;
CreateLinkList(&LL);
Magician(&LL);
PrintLinkList(LL);
return 0;
}
2020-08-21[單循環(huán)鏈表解決魔術(shù)師發(fā)牌問題]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。