#include<iostream.h>
#include<stdlib.h>
template<class T>
struct CircLinkNode//循环链表结点定义
{ T data;//数据域
CircLinkNode<T> *link;//指针域
//仅初始化指针成员的构造函数
CircLinkNode(){link=NULL;}
//初始化数据与指针成员的构造函数
CircLinkNode(T& x)
{data=x;link=NULL;}
};
template<class T>
class CircList//无附加头结点的循环链表类定义
{ private:
CircLinkNode<T> *first,*last;//头指针,尾指针
public:
CircList();//无参构造函数
CircLinkNode<T> *getHead()const{return first;}//获取头指针
void input(int n);//输入函数
void output(int n);//输出函数
};
template<class T>
CircList<T>::CircList()
{ //无参构造函数
first=last=new CircLinkNode<T>;
last->link=first;
}
template<class T>
void CircList<T>::output(int n)
{ //输出无附加头结点的循环链表中n个结点的数据
CircLinkNode<T> *current=first;
cout<<"循环链表各结点的数据值为:"<<endl;
for(int i=1;i<=n;i++)
{ cout<<current->data<<" ";
current=current->link;
}
cout<<endl;
}
template<class T>
void CircList<T>::input(int n)
{ //用后插法输入含n个结点的无附加头结点的循环链表
CircLinkNode<T> *newNode;
T value;
cout<<"请输入"<<n<<"个结点的数据值"<<endl;
for(int i=1;i<=n;i++)
{ //创建第i个结点
cin>>value;
newNode=new CircLinkNode<T>(value);
if(newNode==NULL)
{ cerr<<"存储分配错误!"<<endl;exit(1);}
if(i==1)
{//创建第1个结点
first=last=newNode;
last->link=first;
}
else
{ //创建其它结点
last->link=newNode;
last=newNode;
last->link=first;
}
}
}
template<class T>
void Josephus(CircList<T>& Js,int n,int m)
{ CircLinkNode<T> *p=Js.getHead(),*pre=NULL;
int i,j;
for(i=0;i<n-1;i++)//执行n-1次
{ for(j=1;j<m;j++) //数m-1人
{ pre=p;p=p->link;}
cout<<"出列的人是"<<p->data<<endl;//输出
pre->link=p->link;delete p;//删去
p=pre->link;
}
cout<<"幸运者为"<<p->data<<"号"<<endl;
}
void main()
{ CircList<int> clist;
int n,m;
cout<<"输入旅客人数和报数值:";
cin>>n>>m;
clist.input(n);//输入含n个结点的循环链表
//输出2*n个结点的数据值,观察链表是否为循环的
clist.output(2*n);
Josephus(clist,n,m);//调用约瑟夫函数
}