约瑟夫问题

本文介绍了一种使用C++模板类实现约瑟夫问题的方法,通过构建循环链表来模拟问题场景,并提供了完整的源代码。文章探讨了创建循环链表的过程及约瑟夫问题的具体解决方案。
/*
 *约瑟夫问题,有什么问题或者大家有什么建议,多谢指点啊!感激不尽
 */ 
 #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;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值