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