约瑟夫环

来源:互联网 发布:淘宝食品店铺名字大全 编辑:程序博客网 时间:2024/05/17 05:28

编号为1,2,3,……,n的n个人按顺时针方向围坐一圈。任选一个正整数作为报数上限m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计程序输出出列顺序。

本人菜鸟,请高手不吝赐教。

 

 

 

#include<iostream>
using namespace std;
class joseph
{
    public:
    int data;//每个人的座位号
    int code;//每个人的密码
    struct joseph *next;//保存下一个结点的地址
}list;
void build(joseph *list,int n)
{
    int i;
    joseph *p,*q;
    list->data=1;
    cout<<"请输入"<<n<<"个人的密码"<<endl;
    cin>>list->code;
    q=list;//q代表尾结点
    for(i=2;i<=n;i++)
    {
        p=new joseph;
        p->data=i;
        cin>>p->code;
        q->next=p;
        q=p;
    }
    p->next=list;
}
void operate(joseph *list,int n,int m)
{
    joseph *p,*q,*r;
    int x=n;//x表示当前环内的人数
    p=list;
    while(p->next!=list)
    {
        p=p->next;//找到尾结点
    }
    while(p->next!=p)
    {
        q=p;
        m%=x;
        if(m==0)
        {
            m=x;
        }
        while(--m)
        {
            q=q->next;//找到将要被删除的结点的上一个结点
        }
        r=q->next;//找到将被删除的结点
        q->next=r->next;
        cout<<r->data<<' ';
        m=r->code;
        --x;
        delete[]r;
        p=q;
    }
    cout<<p->data<<endl;
    delete[]p;
}
int main()
{
    joseph *list=new joseph;
    int n,m;
    cout<<"请输入总人数"<<endl;
    cin>>n;
    build(list,n);
    cout<<"请输入初始密码值"<<endl;
    cin>>m;
    cout<<"出列顺序为"<<endl;
    operate(list,n,m);
    return 0;
}

原创粉丝点击