此问题的要求为:n个人围坐一圈,从第一个人开始数,每数到k,这个人就出列,圈中的下一个人重新从1开始计数,直到剩余人数不足k人
下面我画图来加深理解(抱歉目前还不会用电脑绘制动画,只好手动绘制,比较粗糙,之后有时间我改进下!!(看起来像个效果器上面的一堆旋钮哈哈哈
下面附上完整代码:
//约瑟夫环
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int *data;
int front,rear;
int queuesize;
int length;
}Queue;
void Init (Queue *Q) //构造一个队列
{
Q->queuesize = 100;
Q->data = (int *)malloc(Q->queuesize*sizeof(int));
Q->front = Q->rear = 0;
Q->length = 0;
}
void build (Queue *Q) //为队列赋值
{
int i,n;
printf("请输入环中元素个数:\n");
scanf("%d",&n);
printf("请输入元素:\n");
for(i=0;i<n;i++)
{
scanf("%d",&Q->data[Q->rear]);
Q->length++;
Q->rear = (Q->rear+1)%100;
}
/*for(i=0;i<n;i++) //检验是否入队成功
{
printf("%d ",Q->data[Q->front]);
Q->front = (Q->front+1)%100;
}*/
printf("\n------%d-----\n",Q->length); //输出队列长度
Q->front = 0;
}
void EnQue (Queue *Q,int e) //入队
{
if((Q->rear+1)%100 != Q->front)
{
Q->data[Q->rear] = e;
Q->rear = (Q->rear+1)%100;
}
}
void OutQue(Queue *Q) //出队
{
if(Q->rear != Q->front)
{
Q->front = (Q->front+1)%100;
}
}
void display(Queue *Q) //输出(也包含出队的功能)
{
if(Q->rear != Q->front)
{
printf("%d ",Q->data[Q->front]);
Q->front = (Q->front+1)%100;
}
}
void yuesefu(Queue *Q)
{
int k=1,e;
while(Q->rear!=Q->front&&Q->length>=3)
{
e = Q->data[Q->front];
if(k == 3)
{
display(Q);
k = 1;
Q->length--;
}
else
{
OutQue(Q); //就是让这个不出列的数先从头出队,再从队尾入队
EnQue(Q,e);
k++;
}
}
}
int main()
{
Queue Q;
Init(&Q);
build(&Q);
yuesefu(&Q);
return 0;
}