#include
#include
typedef struct node
{
int *base;
int front;
int rear;
}Node;
/*
思路:
*使用一个顺序循环队列来存放元素
*SIZE的值为元素个数+1,用一个空位来存放rear指针
*若未到数m,则将队头元素放在队尾,并使front后移一位
*若数到m,则将其出队,并输出元素
*/
int SIZE=100;//定义全局变量SIZE,方便后面修改其值的大小
int InitNode(Node *p)
{
p->base=malloc(SIZE*sizeof(int));
if(!p->base)
return 0;
p->front=p->rear=0;
return 1;
}
int insert(Node *p,int e)
{
if(p->front==(p->rear+1)%SIZE)
return 0;
p->base[p->rear]=e;
p->rear=(p->rear+1)%SIZE;
return 1;
}
int delelem(Node *p,int e)
{
if(p->front==p->rear)
return 0;
e=p->base[p->front];
p->base[p->front]=0;
p->front=(p->front+1)%SIZE;
return e;
}
int test(Node *p,int i,int m)//进行约瑟夫游戏
{
int num,a,b,j;
if(i!=1)//若位置不从第一个开始,则调整头指针和尾指针的位置,使它们始终相邻(即相当于头指针始终指向i,尾指针始终指向头指针的前一个位置)
{
b=p->base[p->rear-1];//此处的p->rear-1是因为专门有一个空位置来存放尾指针
p->front=i-1;//使front指向第i个位置
for(j=0;j
{
p->base[p->rear]=p->base[(p->rear+1)%SIZE];
p->rear=(p->rear+1)%SIZE;
}
p->base[p->rear]=b;
}
while(1)
{
num=1;
while(num!=m)
{
num++;
a=delelem(p,a);//将队头元素取出,并使头指针后移一位
insert(p,a);//将取出的队头元素插入到队尾
}
a=delelem(p,a);//若num=m,则删除该元素(即出队)
printf("%d ",a);//输出出队的元素
if(p->front==p->rear)//若全部元素都已经出队,则退出循环
break;
}
printf("\n");
return 1;
}
void print(Node *p)
{
int s;
if(p->front==p->rear)
{
printf("为空\n");
exit(0);
}
printf("如下:\n");
s=p->front;
while(s!=p->rear)
{
printf("%d ",p->base[s]);
s++;
}
printf("\n");
}
int main()
{
Node p;
int m,n,i,j;
printf("请输入元素个数n:");
scanf("%d",&n);
printf("请输入m(数到m就退出):");
scanf("%d",&m);
printf("请输入i(从第i个位置开始数):");
scanf("%d",&i);
SIZE=++n;//SIZE=++n是为了空出一个位置来存放rear指针
InitNode(&p);
for(j=1;j<=n;j++)
{
insert(&p,j);//使n个元素入队
}
//print(&p);
test(&p,i,m);
return 0;
}
标签:队列,约瑟夫,int,base,printf,front,C语言,rear,SIZE
来源: https://blog.csdn.net/qq_41032474/article/details/89715283