约瑟夫环
一、需求分析
(1)实现功能:利用单向循环链表存储结构模拟此过程,按照出列顺序输出每人的编号。
(2)测试数据:初始密码m=20;人数n=7。这7个人的密码依次为:3,1,7,2,4,8,4。这组数据的正确出列顺序应该是6,1,4,7,2,3,5。
(3)基本操作:程序运行后,首先要求用户指定初始报数上限值,然后读取各人的密码。可设n≤30。
二、部分代码
1.创建链表
struct Node
{
int num;
int password;
Node *next;
};
2.指针
Node *head; //头指针
Node *rear;//尾指针
3.创建一个约瑟夫环
Node *create(int n)//创建一个约瑟夫环
{
if(n<=0)
cout<<"无法成环"; //输入人数,若人数小于等于0,则输出无法成环
else{
Node *s;
int password[30];
cout<<"请输入"<<n<<"个人的密码:";//输入密码
for (int j=0;j<n;++j)//循环输入
cin>>password[j];
for (int i=1;i<=n;++i)
{
s=new Node;//申请动态
s->num=i;
s->password=password[i-1];
if(i==1)
{
head=s;
rear=s;
}
else
{rear->next=s;
rear=s;}
}
rear->next=head; //最后一个结点的next指向第一个结点,产生一个环
return 0;
}
}
4.输出环数据
Node *create(int n)//创建一个约瑟夫环
{
if(n<=0)
cout<<"无法成环"; //输入人数,若人数小于等于0,则输出无法成环
else{
Node *s;
int password[30];
cout<<"请输入"<<n<<"个人的密码:";//输入密码
for (int j=0;j<n;++j)//循环输入
cin>>password[j];
for (int i=1;i<=n;++i)
{
s=new Node;//申请动态
s->num=i;
s->password=password[i-1];
if(i==1)
{
head=s;
rear=s;
}
else
{rear->next=s;
rear=s;}
}
rear->next=head; //最后一个结点的next指向第一个结点,产生一个环
return 0;
}
}
本程序借鉴资料与相关代码,不住之处希望指出。