#include<stdio.h>
#include<stdlib.h>
typedef int ElemeType;
typedef struct cod
{
ElemeType data[100001];
int rare,front;
int MaxSize;
} CirQueue;
CirQueue *InitCQueue() //将队列置为空
{
CirQueue *q=(CirQueue *)malloc(sizeof(struct cod));
q->rare=q->front=0;
q->MaxSize=100001;
return q;
}
int EnCqueue(CirQueue *q,ElemeType x) //入队
{
if(((q->rare)+1)%(q->MaxSize)==q->front)//判断队列是否满了
{
printf("The Queue is flow!!!!\n");
return 0;
}
q->data[q->rare]=x;
q->rare=(q->rare+1)%(q->MaxSize);//将对应的下表向后移动
return 1;
}
int DeCqueue(CirQueue *q,ElemeType *x) //出队
{
if(q->rare==q->front) //判断表是否为空
{
printf("\nGame over!!!!!!!!\n");
return 0;
}
*x=q->data[q->front];
q->front=(q->front+1)%(q->MaxSize);//将对应的下表向后移动
return 1;
}
//int CQueueLength(CirQueue *q) //计算出当前的元素的个数
//{
// return (q->rare-q->front+q->MaxSize)%q->MaxSize;
//}
int test()
{
CirQueue *q=InitCQueue();
int count;
int key;
int con;
int cache;
scanf("%d",&count);
scanf("%d",&con);
if(con>count){
printf("error!");
return 0;
}
cache=con;
int i=1;
while(count--){
EnCqueue(q,i++);
}
while(q->rare!=q->front)
{
while(--con){//跳过前面的值
DeCqueue(q,&key);//先取出值
EnCqueue(q,key);//再次存入值
}
if(((q->front)+1)%(q->MaxSize)==q->rare)//判断最后一个不加上空格
{
DeCqueue(q,&key);//取除但是不存入
printf("%d",key);//显示取出的值
break;
}
if(q->rare!=q->front)
{
DeCqueue(q,&key);//取除但是不存入
printf("%d ",key);//显示取出的值
}
con=cache;//让计数器回到原来的值
}
}
int main()
{
// CirQueue *q=InitCQueue();
// int count;
// int x;
int value;
// scanf("%d",&count);//给定要输入的个数
// while(count--) //为每一个数进行赋值
// {
// scanf("%d",&x);
// }
// //下面是正常遍历的结果,因为会与后面的生死者游戏冲突所以这里我把它注释掉了
while(DeCqueue(q,&value)){
printf("%d\t",value);
}
//实现12的生死者游戏
test();
return 0;
}