【C++】用循环链表实现约瑟夫环

来源:互联网 发布:mac桌面图标整理工具 编辑:程序博客网 时间:2024/04/29 20:39

已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围,他们 每个人都一个密码。先设定一个数为m,从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到上个人密码的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

#include<iostream>using namespace std;class linknode{public:int number;int cipher;linknode *next;linknode(int number,int cipher){this->number = number;this->cipher = cipher;this->next = NULL;}};class linklist{public:int size;bool first;linknode *current;linknode *head;linklist(){this->first = true;this->size = 0;linknode *h = new linknode(0,0);this->head = h;this->current = NULL;}void insert(linknode *x){if(size==0){head->next = x;x->next = head;}else{current = head;while(current->next!=head)current = current->next;current->next = x;x->next = head;}size++;}void deletenode(linknode *x){if(size==0)exit(0);else{current = head;while(current->next!=x)current = current->next;current->next = x->next;}size--;}void JesephRing(int m){if(size==0)return;int h;if(first==true)    current = head;for(int i = 0;i<m;i++){current = current->next;if(current == head){current = current->next;}}h = current->cipher;cout<<current->number<<endl;deletenode(current);first = false;JesephRing(h);}};int main(){linklist u;int a[7][2] = {{1,3},{2,1},{3,7},{4,2},{5,4},{6,8},{7,4}};int k = sizeof(a)/sizeof(a[0]);for(int i = 0;i<k;i++){u.insert(new linknode(a[i][0],a[i][1]));}u.JesephRing(20);}


0 0
原创粉丝点击