這道題的位址,想嘗試的小夥伴可以來試哦:
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了,輸出帶換行符;
參考代碼: