#include <iostream>
using namespace std;
class Node
{
public:
friend class List;
Node *next;
int data;
};
class List
{
public:
List();
~List();
void ClearList();
Node *Locate(int i);
void Josephus(List &a,int n,int m);
bool ListInsert(int i);
void Reverse();
void output();
private:
Node *first;
Node *last;
};
List::List()
{
first= new Node;
first->next=first;
}
void List::ClearList()
{
Node *currentNode = NULL;
while(first!=first->next)
{
currentNode=first->next;
first->next=currentNode->next;
delete currentNode;
}
}
List::~List()
{
ClearList();
delete first;
first=NULL;
}
Node *List::Locate(int i)
{
Node *currentNode=first;
Node *currentNodeBefore=NULL;
for(int k=0;k<i;k++)
{
currentNodeBefore=currentNode;
currentNode=currentNode->next;
}
return currentNode;
}
void List::Josephus(List &a,int n,int m)
{
Node *p=NULL;
p=a.Locate(1);
Node *pre=NULL;
int i,j;
for(i=0;i<n-1;i++)
{
for(j=1;j<m;j++)
{
pre=p;p=p->next;
}
cout<<"出列的人是"<<p->data<<endl;
pre->next=p->next;
delete p;
p=pre->next;
}
}
bool List::ListInsert(int i)
{
Node *currentNode=Locate(i);
if(NULL==currentNode)
{
return false;
}
Node *newNode=new Node;
newNode->data=i;
newNode->next=currentNode->next;
currentNode->next=newNode;
return true;
}
void List::Reverse()
{
Node *prevNode=first;
Node *curNode=first->next;
Node*nextNode=curNode->next;
while(first!=curNode)
{
curNode->next=prevNode;
prevNode=curNode;
curNode=nextNode;
nextNode=curNode->next;
}
first->next=prevNode;
}
void List::output()
{
Node *currentNode=first->next;
while(currentNode!=first)
{
cout<<currentNode->data<<' ';
currentNode=currentNode->next;
}
cout<<endl;
}
int main()
{
List Js;
int i,n,m;
cout<<"输入游戏者人数和报数间隔";
cin>>n>>m;
for(i=1;i<=n;i++)
{
Js.ListInsert(i);
}
Js.Reverse();
Js.output();
Js.Josephus(Js,n,m);
return 0;
}