循环链表实例-约瑟夫环问题

题目描述:有n个小孩围成一圈,将他们从1开始依次编号,从编号为1的小孩开始报数,数到第m个小孩出列,然后从出列的下一个小孩重新开始报数,数到第m个小孩又出列,如此反复,直到所有小孩全部出列为止。


解:采用循环链表存放约瑟夫环,结点类型为:

struct Child
{
int no;
Child *next;
};


代码实现:

#include<iostream>


using namespace std;


struct Child
{
int no;
Child *next;
};

class Joseph
{
private:
int n,m;
Child *h;
public:
Joseph(int n1,int m1);
~Joseph(){}
void Jsequence();
};
Joseph::Joseph(int n1,int m1)
{
n=n1;m=m1;
h=new Child();
h->no=1;
h->next=h;
Child *p,*q;
p=h;
for(int i=2;i<=n;i++)
{
q=new Child();
q->no=i;
q->next=h;
p->next=q;
p=q;
}
}
void Joseph::Jsequence()
{
Child *q,*p;
p=h;q=p->next;
for(int i=2;i<=m && q!=p;i++)
{
if(i==m)
{
p->next=q->next;
cout<<q->no<<" ";
delete q;
q=p->next;
i=0;
}
else
{
p=p->next;
q=q->next;
}
}

//最后当只剩下一个结点时的特殊处理
cout<<q->no<<endl;

delete q;
}
int main()
{
int m,n;
while(1)
{
cout<<"Input n,m:"<<endl;
cin>>n>>m;
Joseph jse(n,m);
jse.Jsequence();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值