求帮解释程序,是关于“使用循环链表设计出圈游戏”的一个菜单程序,该如何处理

求帮解释程序,是关于“使用循环链表设计出圈游戏”的一个菜单程序
本帖最后由 xipanzhuying 于 2010-12-20 22:51:27 编辑
以下五个程序是一个菜单程序
是关于“使用循环链表设计出圈游戏”的一个菜单程序
希望有人帮我详细解释一下各个程序,可怜的我看不懂
1、Ring.h

#if!defined(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();            //释放内存
};
#endif


2、Ring.cpp
#include"Ring.h"
//构造函数
Ring::Ring(int n)
{
ofstream out("play.txt");
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);   //游戏者的名字
out<<pCurrent->code<<" "<<pCurrent->name<<endl;  //存入文件
}
out.close();     //关闭文件
cout<<"参加游戏人员的编号和名字如下:"<<endl;
Display();       //输出参加者信息
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()
{
ofstream out("win.txt",ios::app);    //打开文件,从后部追加
out<<pCurrent->code<<" "<<pCurrent->name<<endl; //写入文件
out.close();                                    //关闭文件
//摘除操作 
pTmp->next=pCurrent->next;
pCurrent=pTmp;
}
//析构函数,释放动态数组空间
Ring::~Ring()
{delete[]pBegin;}


3、Jose.h
#if!defined(JOSE_H)
#define JOSE_H
class Jose
{
private:
int number;          //参加游戏的人数
int interval;        //计数间隔
public:
Jose(int=0,int=0);   //默认参数形式
int GetNum();        //返回参加游戏的人数
void Initial();      //接收游戏人数和计数间隔
void Find();         //求解并输出结果
void handle_menu();  //菜单处理
int menu_select();   //菜单选择
void DispWin();      //显示出圈顺序文件的内容
void DispOld();      //显示参加游戏者的文件内容
};
#endif


4、Jose.cpp
//预处理
#include"Ring.h"
#include"Jose.h"
using namespace std;
//构造函数
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;}
//输出计算结果文件的内容
void Jose::DispWin()
{
cout<<"输出出圈顺序的编号和名字"<<endl;
cout<<"编号\t"<<"名字"<<endl;
ifstream in("win.txt");         //打开计算结果文件
int temp,n=GetNum();
char s[10];
for(int i=0;i<n;i++)
{
in>>temp;                  //读入编号
in>>s;                     //读入名字
cout<<temp<<"\t"<<s<<endl; //输出编号和名字
}
in.close();                     //关闭文件
}
// 输出原始文件内容
void Jose::DispOld()
{
cout<<"原来参加游戏游戏者编号和名字"<<endl;
cout<<"编号\t"<<"名字"<<endl;
ifstream in("play.txt");             //打开计算结果文件
int temp,n=GetNum();
char s[10];
for(int i=0;i<n;i++)
{
in>>temp;                        //读入编号
in>>s;                           //读入名字
cout<<temp<<"\t"<<s<<endl;       //输出编号和名字
}
in.close();
}




5、main.cpp
//预处理
#include"Ring.h"
#include"Jose.h"
//主函数
int main()
{
ofstream incls("win.txt");       //将文件原来的内容删除
incls.close();                   //关闭文件
Jose game;                       //创建游戏对象
game.handle_menu();              //调用菜单处理函数,供用户选择
return 0;
}
//**********************************
//*菜单处理函数                    *
//*函数原型:void handle_menu(void)*
//*功 能:处理选择的菜单命令        *
//*参 数:void                     *
//*返回值:void                    *
//*工作方式:根据命令,调用相应函数*
//**********************************
void Jose::handle_menu()
{
for(;;)
{
switch(menu_select())
{
case 1:
Initial();
Find();
break;
case 2:
DispOld();
break;
case 3:
DispWin();
break;
case 4:
cout<<"\t再见!\n";
return ;
}
}
}
//***************************************
//*菜单选择函数                         *
//*函数原型:int menu_select(void)      *
//*功 能:接受用户选择的命令代码        *
//*参 数:void                          *
//*返回值:int                          *
//*工作方式:返回命令代码的整数值       *
//***************************************
int Jose::menu_select()
{
char s[2];
int cn;
cout<<"\t1.出圈游戏\n";
cout<<"\t2.输出参加游戏者编号和姓名\n";
cout<<"\t3.输出出圈顺序的编号和名字\n";
cout<<"\t4.退出程序\n";
cout<<"\t输入1-4:";
for(;;)
{
gets(s);
cn=atoi(s);
if(cn<1||cn>5)
cout<<"\n\t输入错误,重选1-4:";
else 
break;
}
return cn;
}



希望能得到每个程序的详细解释,越详细越好,谢谢

------解决思路----------------------
注释已经写的很细了。
lz如果不知道什么是循环链表,那应该去学下 数据结构
------解决思路----------------------
google 约瑟夫问题
------解决思路----------------------
你的代码太复杂了,没必要。先从这个理解,等理解透了可以自己实现具体结构。

#include <iostream>
#include <queue>
using namespace std;

void joshfool(int n, int nth) //共1,2,3,...,n个人,每次nth个人出队,nth=[1, n]
{
queue<int> josh;
for (int i=1; i<=n; i++)
{
josh.push(i);
}
while (!josh.empty())
{
for (int j=0; j<nth-1; j++)
{
int temp = josh.front();
josh.pop();
josh.push(temp);
}
printf("第%d个人出列\n",josh.front() );
josh.pop();


}


}

int main()
{
joshfool(10,3);
}