首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言約瑟夫環鏈表實現代碼審查:規範性與效率的權衡建議

     編輯:程式設計綜合問答

代碼結構概覽

實現經典約瑟夫問題:n 只猴子圍圈,每報數 m 淘汰一只,從第 p 只開始,求最後存活編號。使用帶頭節點的循環單鏈表。

關鍵問題點

  1. 頭文件缺失:#include <stdio.h> #include <stdlib.h> 未寫全,編譯器隱式聲明警告。
  2. 函數聲明前置:M *create_list(M **, int); 應放在 main 前或頭文件中。
  3. 變量重名:main 中 int n; 與 for 循環內 int n, m, p; 遮蔽,極易誤讀。
  4. 內存洩漏風險:game 函數中 headp 分配後未在程序結束前 free 剩餘節點(雖然過程中已逐個釋放淘汰節點,但最後存活節點未釋放)。
  5. 輸入緩衝區殘留:scanf 後換行符殘留,建議用 while(getchar()!='\n'); 清理。

規範性改進建議

  • 統一縮進(4 空格)、大括號風格(K&R 或 Allman)。
  • 關鍵邏輯添加註釋:創建鏈表、定位起始節點、淘汰循環、釋放內存。
  • 錯誤處理:malloc 返回值檢查,scanf 返回值驗證。
  • 函數單一職責:拆分 create_list、find_start、eliminate、free_list。

效率優化方向

  • 數學公式解法:f(n,m) = (f(n-1,m)+m)%n 遞推,O(n) 時間 O(1) 空間,無需鏈表。
  • 靜態數組模擬鏈表(參考 ID 33927),消除 malloc 開銷,適合嵌入式環境。

審查結論

代碼邏輯基本正確,能跑通測試用例。若追求**工程規範**,按上述改進重構;若追求**極致性能**,改用遞推公式或靜態數組。建議根據項目定位二選一,不要過度優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved