/******************************************************
版权所有(C++)2015,杜佳丽
文件名称:约瑟夫.c
作者:杜佳丽
完成日期:20141225
*******************************************************/
#include<iostream>
#include<cstdlib>
using namespace std;
class Node//双向循环链表的结点类
{
friend class Doublelist;
friend void DoubleJoseph();
public:
Node();
int data;
Node *prior;
Node *next;
private:
};
class Doublelist//双向循环链表类
{
friend void DoubleJoseph();
public:
void Creatlist(Doublelist &L);//建立双向循环链表
int getLength(Doublelist &L);//获得链表长度
Doublelist();
private:
Node *Head;
};
Node::Node()//Node类的构造函数,初始化首结点数据
{
data=0;
prior=NULL;
next=NULL;
}
Doublelist::Doublelist()//Doublelist类的构造函数,初始化首结点数据
{
Head=NULL;
}
void Doublelist::Creatlist(Doublelist &L)//建立双向循环链表
{
cout<<"请输入双向生死游戏的总人数N:"<<'\t';
int n;
cin>>n;
Node *p,*s;
for(int i=1;i<=n;i++)
{
p=new Node;
p->data=i;
p->next= NULL;
if(i==1)
{
L.Head=p;
p->prior=NULL;
s=L.Head;
}
else
{
s->next=p;
p->prior=s;
s=s->next;
}
}
s->next=L.Head;
L.Head->prior=p;
}
int Doublelist::getLength(Doublelist &L)//获取双向链表的长度
{
Node *p=L.Head;
int count=0;
while(p->next!=L.Head)
{
count++;
p=p->next;
}
count++;
return count;
}
void DoubleJoseph()//实现约瑟夫双向生死游戏
{
Doublelist L;
L.Creatlist(L);
cout<<"请输入游戏开始的位置S:"<<'\t';
int s;
cin>>s;