任意约瑟夫环
/*
任务:
一群小孩围成一圈,任意假定一个数m,从第一个小孩起,顺时针方向数,每数到第m个小孩时,该小孩便离开。
小孩不断离开,圈子不断缩小。最后剩下的一个小孩便是胜者。求胜者的编号?
要求
以面向对象技术进行程序设计
建立环状链表类
程序便于维护与扩张:如易于对小孩数量n和数数间隔m进行变化
改变获胜者数量,使其可设为任意值
可中途增加小孩人数
*/
//类的实现
#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct List
{
ElemType data;
struct List *next;
}LinkNode,*LinkList;
class Huan
{
public:
void setNumber();
void creat_List();
void insert();
void deal();
private:
int number;
int number1;
int winnum;
LinkList real;
};
void Huan::setNumber()
{
cout<<"请输入有多少人:"<<endl;
cin>>number;
cout<<"请输入一个数表示数到该数时有人退出:"<<endl;
cin>>number1;
cout<<"请输入赢家人数:"<<endl;
cin>>winnum;
}
void Huan::creat_List()
{
LinkList first=new LinkNode;
first->data=-1;
LinkList p=first;
if(first==NULL)
{
cout<<"分配内存失败"<<endl;
exit(0);
}
cout<<"请输入相应数据"<<endl;
for(int i=0;i<number;i++)
{
p->next=new LinkNode;
cin>>p->next->data;
p=p->next;
}
p->next=first;
real=p;//把头结点赋给real
}
void Huan::insert()
{
LinkList p=real;
cout<<"还剩下"<<number<<"个人.请输入在"<<real->data<<"后面的第几个位置"<<endl;
int i;
cin>>i;
while(true)
{
if(i>number||i<1)
{
cout<<"输入数据有误,请重新输入"<<endl;
cin>>i;
}
else
break;
}
if(p->data==-1)
p=p->next;
for(int j=1;j<i;)//找结点到前驱
{
if(p->data!=-1)
{
p=p->next;
j++;
}
if(p->data==-1)
p=p->next;
}
LinkList l=new LinkNode;
cout<<"请输入这个人的号码:"<<endl;
cin>>l->data;
l->next=p->next;
p->next=l;
number++;
}
void Huan::deal()
{
int tag=0;char choice;int peopleNum;
LinkNode *p,*load;
while(number>winnum)//real为删除指定点的前驱
{
if(real->next->data==-1)
{
real=real->next;
continue;
}
else
{
tag++;
if(tag==number1)
{
p=real->next;
real->next=real->next->next;
delete p;
number--;
cout<<"剩余人数的数据为"<<endl;
load=real;
int con=0;
while(con<number)
{
if(load->data==-1)
load=load->next;
else
{
cout<<load->data<<'\t';
load=load->next;
con++;
}
}
cout<<endl;
cout<<"是否有人插入(Y),人数的个数"<<endl;
cin>>choice>>peopleNum;
if(choice=='Y')
{
for(int k=0;k<peopleNum;k++)
{
insert();
cout<<"剩余人数的数据为"<<endl;
load=real;
int con=0;
while(con<number)
{
if(load->data==-1)
load=load->next;
else
{
cout<<load->data<<'\t';
load=load->next;
con++;
}
}
cout<<endl;
}
}
tag=0;
continue;
}
real=real->next;
}
}
cout<<"赢家的数据为:"<<endl;
int times=0;
while(times<winnum)
{
if(real->data!=-1)
{
cout<<real->data<<'\t';
times++;
}
real=real->next;
}
cout<<endl;
}
void main()
{
Huan xin;
xin.setNumber();
xin.creat_List();
xin.deal();
}