📄 3.cpp
字号:
//3.约瑟夫环
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
typedef struct QN
{ int data, num; QN *next; }QN,*Qpt;
typedef struct
{Qpt front; //队头指针
Qpt rear; //队尾指针
}LinkQ;
int InitQueue(LinkQ &Q)//初始化队列
{Q.front=Q.rear=(Qpt)malloc(sizeof(QN));
if(!Q.front)return 0;
Q.front->next=NULL;
return 1;
}
void DestroyQueue(LinkQ &Q)//销毁队列
{while(Q.front)
{Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
}
int EnQueue(LinkQ &Q,int e,int num)//向队列中(确切的说是在对尾插入)插入元素e和密码num;
{ QN *p1=NULL;
p1=(Qpt)malloc(sizeof(QN));
if(!p1)return 0;
p1->data=e;p1->num=num;p1->next=NULL;
Q.rear->next=p1; Q.rear=p1;
Q.rear->next=Q.front->next;
return 1;
}
void main()
{ int n=0,m=0,k=1,s=0;//n表示环内总人数,m时开始计数的初值.
//k环内人的号数,s是向环内插入的'人'
LinkQ Lq; QN *p1,*p;//*p1表示环内人,*p存放要出列的人的指针;
p1=NULL; p=NULL;
if(InitQueue(Lq)==0) cout<<"队列初始化失败"<<endl;
cout<<"环内总人数n=";cin>>n;
cout<<"初始计数m="; cin>>m;
cout<<"请依次输入每个人的密码"<<endl;
for(int i=0;i<n;i++)
{ cin>>s; int j=i+1;
if(!EnQueue(Lq,s,j))
{cout<<"密码输入失败,重新输入!"<<endl;i--;}
}
p=p1=Lq.front->next;
cout<<"环内现有"<<n<<"个人\n";
cout<<"他们的出列(from1~~~~"<<n<<")的顺序如下"<<endl;
//依次输出环内人的出列顺序
while(k<=n)
{
for(int i=1;i<m;i++){p=p1;p1=p1->next;}//保存*p1到*p,并取它的
//下一位重新开始报数开始报数;
m=p1->data; //取*p1的密码为新一轮报数的初值
cout<<"第"<<k<<"个人的"<<"出列号为"<<"\t"<<p1->num<<endl;
k++; p->next=p1->next; free(p1); p1=p->next;
}
}
/*运行结果如下:
环内总人数n=8
初始计数m=9
请依次输入每个人持有的密码
44
11
52
45
6
58
41
48
环内n个人出列(from1~~~~n)的顺序是
第1个人 出列号为1
第2个人 出列号为3
第3个人 出列号为7
第4个人 出列号为8
第5个人 出列号为6
第6个人 出列号为2
第7个人 出列号为4
第8个人 出列号为5*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -