基于循环链表的约瑟夫环实现

来源:互联网 发布:好看的日剧知乎 编辑:程序博客网 时间:2024/05/17 05:00
//头文件一:Ring.h#if !define(RING_H)#define RING_H#include <iostream>#include <fstream>using namespace std;//结构personstruct person{int code;char name[10];person *next;};//类Ringclass Ring{private:person *pBegin;person *pCurrent;person *pTmp;public:Ring (int n);void Countx(int m);void Display();void Dispx();void Clsx();~Ring();};//类JOSEclass 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;}



0 0
原创粉丝点击