约瑟夫环:将编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个开始按顺时针方向自1开始报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。设m的初值为20,密码为:3,1,7,2,4,8,4。
// cx.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<stdlib.h>
#include<iostream.h>
typedef struct LNode
{
int num,pwd;
struct LNode *next;
}LNode, *LinkList;
void main()
{
int a,i,m,n,j;//m为报数上限值,n为人数,j为输入的密码;
cout<<"please enter m and n:";
cin>>m>>n;
LinkList p,p1,pt;
p1=(LinkList)malloc(sizeof(LNode));
p=p1;
for(i=1;i<n;i++)
{
pt=(LinkList)malloc(sizeof(LNode));
p->next=pt;
p=pt;
}
pt->next=p1;
pt=p1;
p=p1;//建立n个节点;
cout<<"please enter the password:";
for(i=1;i<=n;i++)
{
cin>>j;
p->num=i;
p->pwd=j;
p=p->next;
}//输入密码;
for(i=1;i<=n;i++)
{ for(a=1;a<m-1;a++)
{ p=p->next;}
if (m==1)
{m=pt->pwd;
cout<<pt->num;
cout<<",";
p=pt->next;
}
else{ pt=p->next;
m=pt->pwd;
cout<<pt->num;
cout<<",";//输出出列顺序
}
p->next=pt->next;
free(pt);
pt=p->next;
p=pt;
}
}