现在的位置: 首页 > 操作系统 > 正文

C++实现约瑟夫环

2020年02月12日 操作系统 ⁄ 共 1399字 ⁄ 字号 评论关闭

编号是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;}

本文永久更新链接地址:http://www.xuebuyuan.com/Linux/2016-12/138560.htm

以上就上有关C++实现约瑟夫环的全部内容,学步园全面介绍编程技术、操作系统、数据库、web前端技术等内容。

抱歉!评论已关闭.