解決約瑟夫環問題核心步驟:node
1.創建具備n個節點、無頭的循環鏈表ios
2.肯定第一個報數人的位置spa
3.不斷從鏈表中刪除鏈節點,直到鏈表爲空指針
#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef struct lnode { int data; struct lnode *link; }lnode; /** * @brief 約瑟夫環問題: * n 我的,編號爲 1,2,...,n * 從編號K的人開報數(從1開始) * 喊道 m 的人出列,也就是:從 1 數到 m, * * @param total 總人數 * @param start 肯定第一個開始報數的人編號 * @param outnum 指定出列者喊到的數 */ void JOSEPHUS(int total, int start, int outnum) { //1. 定義變量 lnode *p; lnode *r; lnode *curr; //curr 指向尾, curr->link 指向頭 //2. 創建第一個節點 p = (lnode*)malloc(sizeof(lnode)); p->data = 1; p->link = p; curr = p; //3. 創建循環鏈表 for (int i=2; i<=total; i++) { lnode *t = (lnode*)malloc(sizeof(lnode)); t->data = i; t->link = curr->link; curr->link = t; curr = t; printf("%d\n", i); } //4. 指針移動到第一個報數的人 while (start--) { r = p; p = p->link; } //5. 開始遍歷刪除 while (total--) { //定位刪除點 for (int s=outnum-1; s--; r=p,p=p->link); printf("%d->", p->data); //刪除節點 r->link = p->link; free(p); p = r->link; } printf("\n"); } int main() { int total = 10; //總人數 int start = 1; //肯定第一個開始報數的人編號(1,2,...) int outnum = 4; //指定出列者喊到的數 JOSEPHUS(total, start, outnum); }