//头文件一:Ring.h
#if !define(RING_H)
#define RING_H
#include <iostream>
#include <fstream>
using namespace std;
//结构person
struct person
{
int code;
char name[10];
person *next;
};
//类Ring
class Ring
{
private:
person *pBegin;
person *pCurrent;
person *pTmp;
public:
Ring (int n);
void Countx(int m);
void Display();
void Dispx();
void Clsx();
~Ring();
};
//类JOSE
class Jose
{
private:
int number;
int interval;
public:
Jose (int=0,int=0);
int GetNum();
void Initial();
void Find();
};
#endif
//头文件二:Jose.h
//构造函数
Jose::Jose(int n,int m):number (n),interval (m)
{}
//初始化参加人数和间隔
void Jose::Initial()
{
cout<<"输入参加游戏的人:";
cin>>number;
cout<<"输入间隔数:";
cin>>interval;
getchar();
}
//求解函数
void Jose::Find()
{
Ring psn(number);//构造游戏对象
cout<<"游戏结果如下:"<<endl;
for (int i=0;i<number;i++)//循环求解
{
psn.Countx(interval);//计数间隔
psn.Dispx();//输出出圈者
psn.Clsx();//摘除出圈者
}
}
//返回参加游戏人数
int Jose::GetNum()
{return number;}
//Ring.cpp
#include "Ring.h"
//构造函数
Ring::Ring(int n)
{
char s[10];
pBegin=new person[n];//申请动态内存
pCurrent=pBegin;
//建立循环链表
for (int i=1;i<=n;i++,pCurrent=pCurrent->next)
{
pCurrent->next=pBegin+i%n;//将结点链接起来
pCurrent->code=i;
cout<<"输入第"<<i<<"个人的名字:";
gets(s);
strcpy(pCurrent->name,s);//游戏者的名字
}
pCurrent=&pBegin[n-1];//当前游戏者在最后一个编号
}
//计数间隔函数
void Ring::Countx(int m)
{
for (int i=0;i<m;i++)
{
pTmp=pCurrent;
pCurrent=pTmp->next;
}
}
//显示当前出圈者函数
void Ring::Dispx()
{
cout<<pCurrent->code<<""<<pCurrent->name<<endl;
}
//显示全部参加游戏者的函数
void Ring::Display()
{
person *p=pCurrent;
do
{
Dispx();
pCurrent=pCurrent->next;
}while(p!=pCurrent);
}
//将出圈者从循环链表中删除
void Ring::Clsx()
{
//删除操作
pTmp->next=pCurrent->next;
pCurrent=pTmp;
}<pre name="code" class="cpp">//main.cpp
#include "Ring.h"
#include "Jose.h"
//主函数
int main()
{
Jose game;//创建游戏对象
game.Initial();//调用菜单处理函数,供用户选择
game.Find();
return 0;
}
//析构函数,释放动态数组空间Ring::~Ring(){delete []pBegin;}