可控制人数及删除编号的约瑟夫环
#include <iostream>
using namespace std;
#define NULL 0
struct Link
{
int data;
Link *next;
};
class LinkList
{
public:
LinkList(){}
~LinkList(){}
int n;
int m;
int detal;//新增小孩人数
Link *p;
Link *head;//指向头指针
Link h;//头结点
void set();
void GreatLinkList();//构造循环链表
void ChoseNumOflast();
};
void LinkList::set()
{
char c;
cout<<"请输入人数n:"<<endl;
cin>>n;
cout<<"请输入淘汰的编号m:"<<endl;
cin>>m;
cout<<"你是否想增加小孩人数(1.想(Y) 2.不想(N))"<<endl;
cin>>c;
if(c=='Y')
{
cout<<"请输入新增的小孩人数:"<<endl;
cin>>detal;
}
else
detal=0;
}
void LinkList::GreatLinkList()
{
h.next=NULL;
head=&h;
p=head;
for(int i=1;i<=(n+detal);i++)
{
p->next=new Link;
p=p->next;
p->data=i;
if(i!=(n+detal))
{
p->next=NULL;
}
else
{
p->next=head->next;
}
}
}
void LinkList::ChoseNumOflast()
{
int num=0;//循环的次数
int k;
cout<<"请输入获胜者的人数:"<<endl;
cin>>k;
cout<<endl;
p=head;
p=p->next;
/* int n2=0;
int sun=0;
do
{
p=p->next;
n2++;
}while(n2<n-1);
int n1=0;
do{
if(n1%k==0)
{
p->next=p->next->next;
n1++;
sun++;
}
else
{
p=p->next;
n1++;
}
}while(sun<n-1);
cout<<p->data<<endl;*/
// while(p!=p->next)
// {
for(int n1=0;n1<k;n1++)
{
for(int i=1;i<=m-2;i++)
{
p=p->next;
}
p->next=p->next->next;
p=p->next;
cout<<"胜利的人的编号为:"<<endl;
cout<<p->data<<endl;
}
}
void main()
{
LinkList L1[3];
for(int i=1;i<=3;i++)
{
L1[i].set();
L1[i].GreatLinkList();
L1[i].ChoseNumOflast();
cout<<"-------------------------------------------"<<endl;
}
}