约瑟夫问题

来源:互联网 发布:淘宝开店人脸认证失败 编辑:程序博客网 时间:2024/06/07 06:56
/* *约瑟夫问题,有什么问题或者大家有什么建议,多谢指点啊!感激不尽 */  #include<iostream> using namespace std; template<typename T> class Node{ public: T data; Node<T> *next; }; template<typename T> class CLinkList{ private: Node<T> *pFirst;//一个默认的指向第一个元素的指针 Node<T>* findPtr(int k);//从第一个开始第k元素的指针public:CLinkList();//构造函数~CLinkList();//析构函数void createList(int n);//生成循环链表void josephus(int k,int m);//约瑟夫 }; template<typename T> Node<T>* CLinkList<T>::findPtr(int k){ Node<T> *p = pFirst; for(int i = 1;i < k;i++){ p = p->next; } return p; }  template<typename T> CLinkList<T>::CLinkList(){ pFirst = NULL; } template<typename T> CLinkList<T>::~CLinkList(){ Node<T> *temp = NULL;
//从第二元素释放空间,以便确定什么时间停止循环 while(pFirst->next != pFirst){  temp = pFirst->next; pFirst->next = pFirst->next->next; delete temp; } delete pFirst; } template<typename T>
 void CLinkList<T>::createList(int n){//这里有个问题就是创建循环链表时,必须首先创建第一个节点,然后再利用插入法。有没有别的解决方法? Node<T> *p,*q; cout << "请一次输入"<< n << "元素值:" << endl;  pFirst = new Node<T>; cin >> pFirst->data; pFirst->next = pFirst; p = pFirst; for(int i = 1; i < n; i++){ q = new Node<T>; cin >> q->data; q->next = pFirst; p->next = q; p = q; } }
 template<typename T> void CLinkList<T>::josephus(int k,int m){ int count = 2; Node<T> *p,*q; p = findPtr(k); q = p->next; while(p != q){ if(count == m){ cout << q->data << " "; p->next = q->next; delete q; count = 2; p = p->next; q = p->next; } p = p->next; q = p->next; count++; } cout << q->data << " "; delete q; } int main(){ const int N = 7; CLinkList<int> cllist; cllist.createList(N); cllist.josephus(1,5); return 0; }