linux环境 约瑟夫环,C++实现约瑟夫环

该博客介绍了一种使用单向循环链表模拟圆形报数出列的过程,其中涉及动态修改链表节点和根据密码更新报数上限值。具体测试数据为n=7个人,密码分别为3,1,7,2,4,7,4,初始m值为20,最终的正确退出顺序需给出。博客内容还包含了输入输出函数的实现,用于处理用户输入并输出出列顺序。
摘要由CSDN通过智能技术生成

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

#include

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 <password << endl;

delete ptemp;

people_num--;

}

cout << endl;

system("pause");

return 0;

}

0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值