利用模板类生成的循环单链表实现约瑟夫问题。
2010-10-13 11:52
441 查看
PS:15个人排成一圈,给他们1-15的编号,现在从1开始报数,报数字4的人退出,余下的人从退出的下一个位置开始继续刚才的报数,直到整个队列中只剩下一个人为止。请问:这个人是几号?
CirList.h
.cpp文件:
CirList.h
//CirListNode类 #include<stdio.h> template <class T> class CirListNode { T data; CirListNode<T>* link; public: CirListNode():link(NULL){} CirListNode(T value):link(NULL),data(value){} ~CirListNode(){} void SetLink(CirListNode<T>* next); CirListNode<T>* GetLink(); T& GetData(); }; template<class T> void CirListNode<T>::SetLink(CirListNode<T>* next) { link=next; } template<class T> CirListNode<T>* CirListNode<T>::GetLink() { return link; } template<class T> T& CirListNode<T>::GetData() { return data; } //CirList类 template<class T> class CirList { CirListNode<T>* head; CirListNode<T>* tail; CirListNode<T>* cur; public: CirList(); ~CirList(){}; bool AddTail(T value); void RemoveThis(); void RemoveAll(); void SetBegin(); int GetCount(); CirListNode<T>* GetCur(); bool IsEmpty(); T GetNext(); }; //CirList成员函数实现 template<class T> CirList<T>::CirList() { head=tail=new CirListNode<T>; cur=NULL; head->SetLink(head); } template <class T> bool CirList<T>::AddTail(T value) { CirListNode<T>* add=new CirListNode<T>(value); tail->SetLink(add); tail=tail->GetLink(); tail->SetLink(head); if(tail!=NULL) { return true; } else return false; } template<class T> void CirList<T>::RemoveThis() { if(cur==head) { cur=cur->GetLink(); } CirListNode<T>* preCur=cur; for(int i=0;i<this->GetCount();i++) { preCur=preCur->GetLink(); } preCur->SetLink(cur->GetLink()); cur=preCur->GetLink(); preCur=NULL; } template<class T> void CirList<T>::RemoveAll() { SetBegin(); int length=GetCount(); for(int i=0;i<length;i++) { RemoveThis(); } cur=head; } template<class T> void CirList<T>::SetBegin() { cur=head; } template<class T> int CirList<T>::GetCount() { int num=0; CirListNode<T>* here=cur; while(cur->GetLink()!=here) { cur=cur->GetLink(); ++num; } cur=cur->GetLink(); return num; } template<class T> CirListNode<T>* CirList<T>::GetCur() { return cur; } template<class T> bool CirList<T>::IsEmpty() { return head->GetLink()==head; } template<class T> T CirList<T>::GetNext() { if(cur==head) { cur=cur->GetLink(); } T num =cur->GetData(); cur=cur->GetLink(); return num; }
.cpp文件:
#include "CirList.h" #include<iostream> using namespace std; void main() { CirList<int> jos; for(int i=1;i<16;i++){ jos.AddTail(i);} jos.SetBegin(); int length=jos.GetCount(); for(int k=1;k<length;k++) { for(int j=0;j<3;j++) jos.GetNext(); jos.RemoveThis(); } cout<<jos.GetNext()<<endl; }
相关文章推荐
- Unity5序列帧动画实现方法及相关问题的解决方案(利用TexturePacker导出图集、自动生成AnimationClip)
- 从易到难编写C++程序,(6)问题:利用问题(5)的随机数生成实现发牌
- 约瑟夫问题的循环单链表实现
- 约瑟夫环(约瑟夫问题) 采用循环单链表实现
- 利用循环链表实现约瑟夫问题的求解
- 利用双向链表实现约瑟夫问题
- 约瑟夫问题 算法很简单保证每个人都能看懂用的是模拟现实 用数组实现 利用循环删除数组中的元素
- Java中利用递归实现斐波纳斯数列的兔子问题,动态输出兔子的总数
- [C++]模板类的声明与实现分离问题
- 约瑟夫环问题的解释及代码实现
- 算法java实现--贪心算法--最小生成树问题--Prim算法
- 利用org.apache.commons.net.ftp实现ftp下载,解决中文文件名乱码问题
- 利用jasperreports报表生成pdf文档中文不能显示问题解决方法
- # 利用es6的新特性巧妙实现JavaScript中的数组求最大值问题
- 利用Ant 做Android自动化编译实现自动签名, 以及一次生成多个渠道版本.
- ,有一款RESTFUL接口的文档在线自动生成+功能测试功能软件——Swagger UI,具体配置过程可移步《Spring Boot 利用 Swagger 实现restful测试》
- 课程设计——利用信号量实现读-写者问题(JAVA)
- 约瑟夫(Josephus)问题的求解——利用循环链表
- java实现猴子选大王问题(约瑟夫问题)
- ios开发,利用4种UI元素告诉你,怎样实现优化建议及可用性问题