#include<stdio.h>
#include<stdlib.h>
int MAXQSIZE; //循环队列长度为(MAXQSIZE-1)
typedef struct{ //定义队列
int*base;
int front;
int rear;
}SqQueue;
void init(SqQueue&L) //创建循环队列并初始化
{
L.base=(int*)malloc(MAXQSIZE*sizeof(int));
if(!L.base) //若创建失败退出程序
exit(0);
L.front=L.rear=0; //初始化队列赋空
}
void input(SqQueue&L) //初始化循环队列 赋初值
{
int a,b;
while(1) //循环输入当按下回车时结束
{
scanf("%d",&a);
L.base[L.rear]=a;
L.rear++;
b=(MAXQSIZE+L.rear-L.front)%MAXQSIZE;
if(getchar()=='\n'||b==MAXQSIZE-1) //判断是否按下回车以及队是否已满
break;
}
}
int DeQueue(SqQueue&L) //出队函数 并返回值
{
int e;
if(L.front==L.rear) //判断队列是否为空若为空提示有关信息
printf("队列已为空\n");
else //不为空队头出队e记录
{
e=L.base[L.front];
L.base[L.front]=0;
L.front++;
if(L.front>=MAXQSIZE)
L.front%=MAXQSIZE;
}
return e;
}
void EnQueue(SqQueue&L,int e) //入队函数
{
if((MAXQSIZE+L.rear-L.front)%MAXQSIZE==MAXQSIZE-1)
printf("队列已满"); //判断队列是否已满若满提示有关信息
else //未满在队尾入队
{
L.base[L.rear]=e;
L.rear++;
if(L.rear>=MAXQSIZE)
L.rear%=MAXQSIZE;
}
}
void output(SqQueue&L,int start,int distance)//总功能函数
{ //接收队列起始位置与间隔调用函数输出结果
int count=1,i,e;
while(L.front!=start-1) //调用出队入队函数将用户输入位置变为队头
{
e=DeQueue(L);
EnQueue(L,e);
}
while(L.front != L.rear) //当队列不为空时循环输出约瑟夫环的序列
{
if(count!=distance) //count计算用户输入的间隔
{ //不满足到队尾
e=DeQueue(L);
EnQueue(L,e);
count++;
}
else //满足则出队
{
e=DeQueue(L);
printf("%d ",e);
count=1;
}
}
printf("\n");
}
int main() //主函数
{
SqQueue L;
printf("输入队列长度:");
scanf("%d",&MAXQSIZE);
MAXQSIZE+=1;
int start,distance;
init(L);
printf("输入值:");
input(L);
printf("输入起始位置与要排除的数:");
scanf("%d%d",&start,&distance);
output(L,start,distance);
return 0;
}
将所有的元素全部入队,然后再一个个出队,出队的时候记录出队的个数,如果不是第k个,就让他重新入队,如果是第k个,就不用入队了,然后下一个出队的再重新从1开始计算。