我自己编的约瑟夫问题的解决方安有问题呢!大家帮我找一下!
约瑟夫问题是这样的:假设有n个人坐在圆桌周围,从第s个人开始报数,报到m的人出列;
然后继续再从下一个人开始报数报道m的时候出列直到所有的人都出列为止要求按出列先后顺序输出个人的信息.
#include<iostream>
#include"01.h"
using namespace std;
void main()
{
JosepChain J1;
cout<<"请输入由多少个人围成一个圈"<<endl;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{J1.insert(i, i);
}
cout<<"请输入有第几个人开始报数"<<endl;
int s;
cin>>s;
cout<<"请输入报到第几的人出列"<<endl;
int m;
cin>>m;
J1.Delete(n,s,m) ;
}
class JosepChain ;
class chainNode
{public:
friend class JosepChain;
private:
int data ;
chainNode * link;
};
class JosepChain
{private :
chainNode *frist;
public:
JosepChain();
~JosepChain();
JosepChain & insert(int k,int x);//插入函数
JosepChain & Delete(int n,int k,int m);//输出出列的人和删除节点!
};
JosepChain::JosepChain()
{ frist=new chainNode;
frist->link=frist;
frist->data=0 ;
}
JosepChain::~JosepChain()
{//删除释放节点空间
chainNode *p=frist;
if(p->link!=frist)
{p=p->link;
delete frist;
frist=p;
}
delete frist;
}
JosepChain & JosepChain::insert(int k,int x)
{ //在第k个位置上插入x
//如果存在一个节点这么插,存在多个节点这么插啊!
int index=1; //计数器*/
chainNode * y=new chainNode;
chainNode *p=frist;
y->data=x;
if(k==1)
{frist->data=x;
}
if(k==2)
{frist->link=y;
y->link=frist;
}
if(k>2)
{
while (index<k-1&& p->link!=frist)
{
p=p->link;
index++;
}
y->link=p->link ;
p->link=y;
}
return *this;
}
JosepChain & JosepChain::Delete(int n,int s,int m)
{ //由第s个数开始到第m个数取出
//每报数为m的位置输出此处的data的值
int index=1;
chainNode *p=frist,*q;
if(n<s)
cout<<"输入的开始号码大于人数"<<endl;
for(int i=1;i<s-1;i++)
{ p=p->link;
}
for(index=1;index<=n;index++)
{ for(int j=1;j<m-1;j++)
{
p=p->link;
}
cout<<p->data<<" ";
q=p->link;
p->link=q->link;
delete q;
}
//cout<<p->data<<endl ;
//delete p;
return *this;
}