#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();
}