c++难题,约瑟夫环问题,跪求高手解答

来源:百度知道 编辑:UC知道 时间:2024/06/22 11:26:11
请不要用c语言中的struct,可以用对象,主要用数据结构中的单项循环链表。
编号为1,2,3,。。。。n的n个人按顺时针方向围坐一圈,每人持有一个正整数密码,一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计一个程序求出出列顺序

看着给点分行了
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#define LEN 10 //列长度
class ysf
{
public:
ysf *pre;
ysf *next;
int code,key;
};

void main()
{
int code;
cout<<"请输入所用密码:";
cin>>code;
code--;
/*rand((unsigned)time(NULL));*///初始化随机数
ysf link[LEN];
for(int i=0;i<LEN;i++)
{
link[i].key=i+1;
link[i].next=link+i+1;
link[i].pre=link+i-1;
link[i].code=code;//(int)(rand()/1000);//此处现在为一直用一个code计数,可改为随机产生
}
link[i-1].next=link;
link[0].pre=link+i-1;

ysf *p=link;
int c=0;
while(p->next!=p)//在指向自身前一直循环
{
for(c=1;c<=code;c++)//计数,直到指向该出列的节点
p=p->next;
code=p->code;
cout<<p->key<<'\t';
p->next->pre=p->pre;//在循环队列中删除当前节点
p->pre->next=p->next;