您的位置:首页 > 其它

利用模板类生成的循环单链表实现约瑟夫问题。

2010-10-13 11:52 441 查看
PS:15个人排成一圈,给他们1-15的编号,现在从1开始报数,报数字4的人退出,余下的人从退出的下一个位置开始继续刚才的报数,直到整个队列中只剩下一个人为止。请问:这个人是几号?

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐