基于循环链表的约瑟夫问题

#pragma once
#include<iostream>
using namespace std;
template<class T>
class LinkNode //一个结构体对外全部可见
{
public:
	T data; //模板类型的一个数据
	LinkNode<T>* link; //该struct的一个指针,用于指向下一个结点
public:
	LinkNode(LinkNode<T>* ptr = NULL)//只初始化指针的构造函数,并使指针域为空
	{ link=ptr;} 
	LinkNode(const T& item,LinkNode<T>* ptr = NULL)//数据与指针一同初始化的构造函数,依旧指针域默认参数为空
	{ data=item; link=ptr;}
	~LinkNode(){}
};
#include<iostream>
#include"LinkNode.h"
using namespace std;
template<class T>
class PRO
{
protected:
	LinkNode<T> *first;
	int total_num;//约瑟夫问题总人数
	int flag_num;//标志数字
public:
	PRO(int totalnum,int flagnum);
	~PRO();
	void print();
};
template<class T>
PRO<T>::PRO(int totalnum,int flagnum)//初始化问题参数
{
	total_num = totalnum;
	flag_num = flagnum;

	LinkNode<T> *newNode;
	LinkNode<T> *last;//尾结点指针标志
	T value;
	//makeEmpty();//销毁表
	cin>>value;
	first = new LinkNode<T>(value);
	last = first;
	int count=0;
	while(count < total_num-1)//输入元素个数控制
	{
		cin>>value;
		newNode = new LinkNode<T>(value);
		if(newNode == NULL)
		{
			cout<<"内存分配错误"<<endl;
			exit(1);
		}
		last->link = newNode;
		last = newNode;

		count++;
	}
	last->link = first;//先按照顺序的链表开辟最后首尾相连
}

template<class T>
PRO<T>::~PRO()
{}

template<class T>
void PRO<T>::print()
{
	LinkNode<T> * del;//记录待出局者
	LinkNode<T> *current = first;//头指针的一个副本
	while(/*current->link != current*/ total_num > 1)//当条件成立之时,链表中只剩下一个人了,此为幸存者
	{
		for(int k=1;k<flag_num-1 ;k++)//每一次小循环控制
			current = current->link;

		del = current->link;//当前指针指向待出局者的上一位,再把待出局者指针赋给del
		current->link = del->link;
		cout<<"#"<<del->data<<endl;
		delete del;//踢出局

		total_num--;//总人数变化
		current = current->link;//把当前指针下移一位,继续大循环,为小循环初始条件
	}
	cout<<"最后幸存者:"<<current->data<<endl;//输出当前指针指向的幸存者
}
#include"Josephus_pro.h"
#include<iostream>
using namespace std;
void main()
{
	PRO<int> p(10,8);
	p.print();
}
原文地址:https://www.cnblogs.com/javawebsoa/p/3108937.html