「優質題解」出圈
- 2020 年 2 月 16 日
- 筆記

這道題的地址,想嘗試的小夥伴可以來試哦:
https://www.dotcpp.com/oj/problem1160.html
思路:
解題思路:(原:1047: C語言程式設計教程(第三版)課後習題10.5)在1047的 的基礎上,把報數的數m改為自己輸入,同時改為多組測試數據,並且輸出帶換行符;
思路一:(公式法)

思路二(循環鏈表法) 1:創建長度為n的循環鏈表(單鏈表的最後一個結點與首結點連接,不是頭結點);
2:鏈表結點包括編號和next指針;
3:從首結點p開始報數(p=p->next),但是只報數到離開的結點的前一個結點,然後刪除它後面的結點,更新報數的第一個結 點(p=p—>next);用指針q指向要刪除的結點;
4:重複上述過程,直到鏈表中只有一個結點結束(即:p->next=p);
5:如下圖假設有6個結點(6個人),報數數為3;


把頭結點free了,因為刪除過程中,頭結點的next被刪除的話,頭結點next指向不安全地方,就不要用它了;



以上就是鏈表的實現過程,要挑戰自己可以弄一個單鏈表實現的,再厲害一點可以順序表,但順序表不推薦,
1.順序表刪除要移動大量元素
2.報數到最後一個之後,返回第一個的實現過程複雜,需要用下標關係,很容易暈;
注意事項: 每個結點刪除後都要free了,輸出留下來的那個人之後也要把它的free了,輸出帶換行符; 參考程式碼:
