#include <iostream.h>
#include <windows.h>
typedef struct Josephu
{
int num;
Josephu *pNext;
}Jose,*pLink;
pLink CreateRing(int n); //建立循环链表
pLink DelLink(pLink pDel); //删除节点
void JosePhuToDel(pLink pJose,int num,int step,int k); //解决JosePhu问题
void main()
{
int num,step,k;
pLink pJose;
cout<<"请输入全部人数: ";
cin>>num;
if(num<0)
num=-num; //确保为正数
cout<<"请输入报数人序号: ";
cin>>k;
if(k<0)
k=-k;
cout<<"请输入序号为几出列: ";
cin>>step;
if(step<0)
step=-step;
pJose=CreateRing(num);
JosePhuToDel(pJose,num,step,k);
}
pLink CreateRing(int n)
{
pLink pHead=NULL;
pLink pTail=NULL;
for(int i=0;i<n;i++)
{
if(0==i) //创建第一个节点
{
pTail=new Jose;
pHead=pTail;
}
else
{
pTail->pNext=new Jose;
pTail=pTail->pNext;
}
pTail->num=i+1; //初始化
pTail->pNext=NULL;
}
pTail->pNext=pHead; //最后围成循环链表
return pHead;
}
pLink DelLink(pLink pDel)
{
pLink sTemp;
sTemp=pDel;
while(pDel->pNext!=sTemp)
{
pDel=pDel->pNext; //找到节点
}
pDel->pNext=sTemp->pNext;
delete sTemp; //删除
return pDel->pNext; //返回下一个
}
void JosePhuToDel(pLink pJose,int num,int step,int k)
{
int i,j;
cout<<"出列序号是: ";
for(i=1;i<k;i++) //从第一个开始找
pJose=pJose->pNext; //找出报数的那个
for(i=0;i<num;i++)
{
for(j=1;j<step;j++)
pJose=pJose->pNext; //找到出列的那个人
cout<<pJose->num<<" "; //打印出来后
pJose=DelLink(pJose); //该序号出列
}
cout<<endl;
}
JosePhu问题
最新推荐文章于 2018-07-17 14:52:47 发布