c语言 队列 游戏,循环队列实现约瑟夫游戏(C语言版)

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值