C++实现约瑟夫环

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

1. 利用单向循环链表存储结构模拟此过程,按照出列顺序输出各个人的号。

2. 测试数据:m 的初值为20,n=7,7 个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?

3. 输入数据:建立输入函数处理输入的数据,输入m 的初值n,输入每个人的密码,建立单向循环链表。

4.输出形式:建立一个输出函数,将正确的出列顺序输出。

程序源代码

#include<iostream>
#include<cstdlib>

using namespace std;

struct PNode{        //成员结构体
    int num;          //成员编号
    int password;      //成员密码
    PNode *next;
};

int main()
{
    PNode *head, *end, *ptemp;        //head,end为两个工作指针,head保存第一个结点,end向后创建链表最后一个结点的next为head,ptemp保存要删除的结点
    int people_num, password_temp, *pass_word;  //人数,临时m,每个人的password 数组
    cout << "请输入人数和m的初值:";
    cin >> people_num >> password_temp;
    pass_word = new int[people_num];      //申请password 数组
    cout << "请依次输入" << people_num << "个人的密码:";
    for (int i = 0; i < people_num; i++)
    {
        cin >> pass_word[i];
    }
    head = end = new PNode;  //创建第一个结点,
    head->num = 1;
    head->password = pass_word[0];
    for (int i = 1; i < people_num; i++)  //将密码数组中的密码赋值给循环链表中
    {
        end->next = new PNode;
        end = end->next;
        end->num = i + 1;
        end->password = pass_word[i];
    }
    end->next = head;    //链接成循环队列
    cout << "人员退出序列:" << endl;
    cout << "编号:" << '\t' << "密码:" << endl;
    while (people_num)
    {
        for (int i = 1; i < password_temp; i++)
        {
            end = end->next;
        }
        ptemp = end->next;
        password_temp = ptemp->password;
        end->next = ptemp->next;
        cout << ptemp->num <<'\t'<< ptemp->password << endl;
        delete ptemp;
        people_num--;
    }
    cout << endl;
    system("pause");
    return 0;
}

猜你喜欢

转载自www.linuxidc.com/Linux/2016-12/138560.htm