實現經典約瑟夫問題:n 只猴子圍圈,每報數 m 淘汰一只,從第 p 只開始,求最後存活編號。使用帶頭節點的循環單鏈表。
#include <stdio.h> #include <stdlib.h> 未寫全,編譯器隱式聲明警告。M *create_list(M **, int); 應放在 main 前或頭文件中。main 中 int n; 與 for 循環內 int n, m, p; 遮蔽,極易誤讀。game 函數中 headp 分配後未在程序結束前 free 剩餘節點(雖然過程中已逐個釋放淘汰節點,但最後存活節點未釋放)。scanf 後換行符殘留,建議用 while(getchar()!='\n'); 清理。malloc 返回值檢查,scanf 返回值驗證。create_list、find_start、eliminate、free_list。f(n,m) = (f(n-1,m)+m)%n 遞推,O(n) 時間 O(1) 空間,無需鏈表。malloc 開銷,適合嵌入式環境。代碼邏輯基本正確,能跑通測試用例。若追求**工程規範**,按上述改進重構;若追求**極致性能**,改用遞推公式或靜態數組。建議根據項目定位二選一,不要過度優化。