关于约瑟夫环的问题 c++循环队列实现
1个回答
推荐于2016-04-12
展开全部
给,已经编译运行确认:
#include <iostream.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
}LNode, *LinkList;
LinkList list = NULL;
int n; //人数
int m; //报数号
//n为总人数,k为第一个开始报数的人,m为出列者喊到的数
void JosephRing(int n, int k, int m)
{
LinkList p, r; /* p为当前结点,r为辅助结点,指向p的前驱结点*/
for(int i = 1; i <= n; i++) /*建立循环队列*/
{
p = (LinkList)malloc(sizeof(LNode));
p->data = i;
if(list == NULL) list = p;
else r->next = p;
r = p;
}
p->next = list; /*使队列循环起来*/
p = list; /*使p指向头节点*/
/*把当前指针移动到第一个报数的人*/
for(i = 1; i < k; i++)
{
r = p;
p = p->next;
}
/*循环地删除队列结点*/
while(p->next != p)
{
for(i = 1; i < m; i++)
{
r = p;
p = p->next;
}
r->next=p->next;
cout<<p->data<<endl;
free(p);
p=r->next;
}
cout<<endl<<"最终剩下的人为: "<<p->data<<endl;
}
int main()
{
int m,n,i;
cout<<"请输入人数n: ";
cin>>n;
cout<<"请输入开始位置i: ";
cin>>i;
cout<<"请输入报数m: ";
cin>>m;
cout<<"出队顺序如下: "<<endl;
JosephRing(n, i, m);
system("pause");
return 1;
}
#include <iostream.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
}LNode, *LinkList;
LinkList list = NULL;
int n; //人数
int m; //报数号
//n为总人数,k为第一个开始报数的人,m为出列者喊到的数
void JosephRing(int n, int k, int m)
{
LinkList p, r; /* p为当前结点,r为辅助结点,指向p的前驱结点*/
for(int i = 1; i <= n; i++) /*建立循环队列*/
{
p = (LinkList)malloc(sizeof(LNode));
p->data = i;
if(list == NULL) list = p;
else r->next = p;
r = p;
}
p->next = list; /*使队列循环起来*/
p = list; /*使p指向头节点*/
/*把当前指针移动到第一个报数的人*/
for(i = 1; i < k; i++)
{
r = p;
p = p->next;
}
/*循环地删除队列结点*/
while(p->next != p)
{
for(i = 1; i < m; i++)
{
r = p;
p = p->next;
}
r->next=p->next;
cout<<p->data<<endl;
free(p);
p=r->next;
}
cout<<endl<<"最终剩下的人为: "<<p->data<<endl;
}
int main()
{
int m,n,i;
cout<<"请输入人数n: ";
cin>>n;
cout<<"请输入开始位置i: ";
cin>>i;
cout<<"请输入报数m: ";
cin>>m;
cout<<"出队顺序如下: "<<endl;
JosephRing(n, i, m);
system("pause");
return 1;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询