数据结构--链表--约瑟夫环问题(单向循环链表)
生活随笔
收集整理的這篇文章主要介紹了
数据结构--链表--约瑟夫环问题(单向循环链表)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
問題:一群人站成一個圓圈,從一個人開始報數(shù),1, 2 ,。。。m,報到m的拉出去砍了,求被砍的順序和最后一個活下來的。
利用單向循環(huán)鏈表實現(xiàn)
C++代碼如下:(參考書籍:數(shù)據(jù)結構與算法實驗指導書)
#include <iostream> using namespace std;struct NodeType {int num;char name[20];NodeType* next; }; class Jose { private:NodeType* p_head; public:Jose(){p_head = new NodeType; //帶空頭的鏈表p_head->next = p_head; //空的循環(huán)鏈表}~Jose(){}void creat();void print(); }; void Jose::creat() {int i = 0, n;NodeType *newp, *tempNode;tempNode = p_head;cout << "\n enter total nums of people: ";cin >> n;for(i = 0; i < n; ++i){newp = new NodeType;newp->num = i+1;cout << "\n enter name: ";cin >> newp->name;newp->next = p_head; //此處p_head為尾部哨兵tempNode->next = newp; //不斷地往尾部(尾部哨兵之前)插入節(jié)點tempNode = newp;}tempNode->next = p_head->next; //斷開空頭哨兵delete p_head; //釋放哨兵節(jié)點p_head = tempNode->next; //頭結點指向第一個節(jié)點 } void Jose::print() {int m,i;NodeType *del = p_head, *tempNode;cout << "\n enter value m(m>=2):";cin >> m;cout << "\n start:" << endl;while(del->next != del) //鏈表節(jié)點個數(shù)不為1{for(i = 1; i < m; ++i) //del往后移動m位{tempNode = del;del = del->next;}cout << del->num << " " << del->name << endl;tempNode->next = del->next; //斷開del節(jié)點delete del; //釋放del節(jié)點del = tempNode->next;}cout << del->num << " " << del->name << endl;delete del; //鏈表只剩一個節(jié)點直接刪除 }int main() {Jose gameList;gameList.creat();gameList.print();cout << "press any key to exit!" ;cin.get();return 0; }Valgrind檢查結果:
假設有5個人,報數(shù)3的出列,手動模擬如下
?
總結
以上是生活随笔為你收集整理的数据结构--链表--约瑟夫环问题(单向循环链表)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql offset函数_mysql
- 下一篇: LeetCode 559. N叉树的最大