出圈問題 單向非迴圈鍊錶(C語言描述)

2021-09-10 13:38:52 字數 1094 閱讀 7271

題目描述

設有n個人圍坐一圈並按順時針方向從1到n編號,從第1個人開始進行1到m的報數,報數到第個m人,此人出圈,再從他的下乙個人重新開始1到m的報數,如此進行下去直到所剩下一人為止。

輸入

輸入多行,每行2個數,分別表示n和m.

輸出

計算每一行中最後剩下這個人的編號.

樣例輸入

10 3
樣例輸出

4
解題思路:

這其實就是約瑟夫環問題。此題很經典,也有很多很好的解法。剛好最近我複習了一下鍊錶,就用簡單的單向非迴圈鍊錶練一下手^^。

詳細**如下:

//此題為約瑟夫環問題

#include #include typedef struct link link;

link *createlist(int n)

tail->next = null;

return head;

}void deletelist(link *p, int x) // 刪除第x個結點

if(p != null)

}int main()

if(i == n)

}printf("%d\n", p->next->pos);

free(p);

}return 0;

}

**還是比較清晰明了的。需要注意的一些地方:

1. n按輪數減小。我並沒有在有人淘汰出圈後立即將n減小(立即減小會出錯),而是引入了count累計,直到完整的一輪(1~n)結束後再縮小n的範圍。

2.鍊錶逢m減小。這就使得每輪鍊錶的長度總是小於等於n,且大多數情況鍊錶長度小於n,即每輪中鍊錶長度等於 n - count。所以某一輪中的第i個座位對應的其實是鍊錶上的第(i-count)個位置。

C 單向迴圈鍊錶

pragma once include using namespace std template class t class singlecircularlinklist template class t class node friend ostream operator ostream os,n...

無頭單向非迴圈鍊錶

首先建立乙個標頭檔案存放所需要的函式功能的宣告slist.h ifndef slist h define slist h include include include include typedef int sltdatatype typedef struct slistnodeslistnode...

單向迴圈鍊錶C語言實現

我們都知道,單向鍊錶最後指向為null,也就是為空,那單向迴圈鍊錶就是不指向為null了,指向頭節點,所以下面這個程式執行結果就是,你將會看到遍歷鍊錶的時候就是乙個死迴圈,因為它不指向為null,也是周而復始的執行。串成了乙個環型。include include typedef struct nod...