單鏈表實現約瑟夫環

2021-07-11 12:34:57 字數 1408 閱讀 8485

語塞夫環問題:

問題來歷:據說著名猶太歷史學家 josephus有過以下的故事:在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從。首先從乙個人開始,越過k-2個人(因為第乙個人已經被越過),並殺掉第

k個人。接著,再越過k-1個人,並殺掉第

k個人。這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什麼地方才能避免被處決?josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

思路:利用鍊錶實現,找到要「殺死的」結點,然後刪除。知道鍊錶中只剩下乙個資料為止。

#define _crt_secure_no_warnings 1

//單鏈表實現約瑟夫環

#includeusing namespace std;

typedef int datatype;

typedef struct slistnode

slistnode;

slistnode* createnode(datatype x) //創造結點

void pushback(slistnode * &pphead, datatype data )

else

cur->next = createnode( data);

}}//列印

void printsnodelist(slistnode *&pphead)

cout << "null";

printf( "\n");

}//約瑟夫環

//yue約瑟夫

slistnode* josecycle(slistnode *& phead, int k )

slistnode* del = cur->next;

cur->data = del->data; //將cur後乙個結點的資料覆蓋到當前節點,

cur->next = del->next;

free(del); //再刪除cur的下乙個結點,作用相當於釋放了cur的結點。

}}slistnode* find(slistnode * phead, datatype x )

cur = cur->next;

}return null ;

}//將鍊錶首尾相連,構成乙個環

單鏈表實現約瑟夫環

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍。從第乙個人開始報數,數到k的那個人出列 他的下乙個人又從1開始報數,數到k的那個人又出列 依此規律重複下去,直到圓桌只剩下乙個人。那麼如何用單鏈表來實現約瑟夫環呢,首先我們需要構建乙個帶環鍊錶,定義乙個指標c...

單鏈表實現約瑟夫環

約瑟夫環 以五個節點的帶環單鏈表 最後乙個節點指向第乙個節點 為例子 1 從煉表頭開始,先刪除第二個節點 2 從刪除節點的下乙個節點開始,再往後找第二個節點,然後刪除。3 一直重複過程2,直到剩下乙個節點,返回該節點。listnode joecircle listnode phead,int m i...

單鏈表實現約瑟夫環

首先先了解一下什麼是約瑟夫環問題 據說著名猶太歷史學家josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺...