Josephus問題解決方法三(單向迴圈連結串列標識法)
前面解決Josephus問題時(http://blog.itpub.net/29876893/viewspace-1815055/,http://blog.itpub.net/29876893/viewspace-1850077/),都是找到該同學後,把該同學從環中除去,然後剩下的同學再組成一個新的環,終止條件是p != p->next。下面我們換種方式考慮該問題,可不可以找到該同學後,標識該同學,然後一直迴圈該環,直到把所有的人都標識,終止迴圈的條件是標識位等於環中的人數(flag=length),最後"標識"的同學就是獲勝者。我把這種方法叫做,“單向迴圈連結串列標識法”,下面給出程式碼:
執行結果:
形成環這裡不必多說,關鍵在於void searchNote(node first,int n),思路就是找到同學後,把該同學貼上標籤,然後繼續迴圈該環,當找到已經被貼上標籤的同學,就跳過該同學,當找到所有的同學後,那麼剩下的同學就是獲勝 者,當然別忘了,遊戲結束後,不能讓同學還是手拉手圍成一個環,那就是void deleteNote(node q)的功能啦,把該環"銷燬"了。上面的解題思路,我想很多朋友會想到,可不可以用陣列解決該問題,當然可以啦!關鍵是清晰的畫出程式流程圖解,程式寫起來會變的相對容易些。
點選(此處)摺疊或開啟
-
#include<iostream>
-
using namespace std;
-
typedef struct Note{
-
char ch;
-
struct Note *next;
-
}*node;
-
-
int length;
-
int flag;
-
-
void initNote(node first) {
-
first = new Note;
-
first->next = NULL;
-
}
-
-
void createNote(node first) {
-
node p, q;
-
p = first;
-
cout << "請依次輸入學生的編號:" << endl;
-
for (char ch; cin >> ch, ch !='#';) {
-
q = new Note;
-
p->next = q;
-
q->ch = ch;
-
cout << q->ch << " ";
-
p = q;
-
length++;
-
}
-
p->next=first->next;
-
}
-
void searchNote(node first,int n) {
-
-
cout << "出隊的順序依次是:" << endl;
-
while (true) { //死迴圈,為了找出所有標識結點
-
for (int i = 1; i <=n; i++) {
-
-
first = first->next;
-
if (first->ch == NULL){ //只要迴圈到ch為空的結點,i減1,並且繼續執行for迴圈
-
i--;
-
continue;
-
}
-
}
-
flag++; //只要結點的first->ch=NULL,則標識就增加1
-
cout << first->ch << " ";
-
if (flag == length) { //已經找到了所有的標識結點,退出死迴圈
-
break;
-
}
-
first->ch = NULL;//把標識結點的資料域置為空
-
}
-
cout << endl;
-
cout << "獲勝的同學是:" << endl;
-
cout << first->ch; //列印出獲勝者
-
}
-
void deleteNote(node q) {
-
node p = q;
-
for (; p != q; p = p->next) {
-
node no = p;
-
delete no;
-
}
-
cout << "環已銷燬!!!" << endl;
-
}
-
int main() {
-
Note note;
-
initNote(¬e);
-
createNote(¬e);
-
cout << endl;
-
searchNote(¬e,4);
-
cout << endl;
-
deleteNote(¬e);
- }
形成環這裡不必多說,關鍵在於void searchNote(node first,int n),思路就是找到同學後,把該同學貼上標籤,然後繼續迴圈該環,當找到已經被貼上標籤的同學,就跳過該同學,當找到所有的同學後,那麼剩下的同學就是獲勝 者,當然別忘了,遊戲結束後,不能讓同學還是手拉手圍成一個環,那就是void deleteNote(node q)的功能啦,把該環"銷燬"了。上面的解題思路,我想很多朋友會想到,可不可以用陣列解決該問題,當然可以啦!關鍵是清晰的畫出程式流程圖解,程式寫起來會變的相對容易些。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1851818/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 單向迴圈連結串列
- Josephus問題解決方法四(迴圈陣列)陣列
- 單向迴圈連結串列大綱
- Josephus問題解決方法五(遞迴)遞迴
- 單向迴圈連結串列的介面程式
- 單向迴圈連結串列的實現
- 實戰資料結構(4)_迴圈單連結串列解決約瑟夫問題資料結構
- 設計單向迴圈連結串列的介面
- JS資料結構第三篇---雙向連結串列和迴圈連結串列之約瑟夫問題JS資料結構
- 連結串列-迴圈連結串列
- 單向迴圈連結串列——查詢、刪除、插入結點
- Josephus問題解決方法一
- Josephus問題解決方法二
- 單鏈迴圈連結串列(初版
- 單向迴圈連結串列介面設計(C語言)C語言
- 連結串列4: 迴圈連結串列
- 複習下C 連結串列操作(雙向迴圈連結串列,查詢迴圈節點)
- c/c++ 線性表之單向迴圈連結串列C++
- 約瑟夫環(Josephus)問題--報數遊戲(連結串列)遊戲
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 迴圈連結串列(約瑟夫問題)--python實現Python
- 雙向迴圈連結串列的介面設計(初版
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- C語言資料結構:單向迴圈連結串列的增刪操作C語言資料結構
- 雙向迴圈連結串列————遍歷、查詢、插入結點
- 自定義雙向迴圈連結串列基本函式介面函式
- javascript中使用迴圈連結串列實現約瑟夫環問題JavaScript
- c/c++ 線性表之雙向迴圈連結串列C++
- 棧_單向連結串列
- 資料結構與演算法(二) -- 線性表之單向迴圈連結串列資料結構演算法
- 資料結構之連結串列與陣列(2):單向連結串列上的簡單操作問題資料結構陣列
- 資料結構之迴圈連結串列資料結構
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 非迴圈單連結串列的建立、遍歷、排序等排序
- c 連結串列之 快慢指標 查詢迴圈節點指標
- 單連結串列的排序問題排序
- 雙向迴圈連結串列基本操作的實現(C語言)C語言
- 實戰資料結構(5)_雙向迴圈連結串列的基本操作資料結構