c语言 队列 游戏,循环队列实现约瑟夫游戏(C语言版)
#include
#include
typedef struct node
{
int *base;
int front;
int rear;
}Node;
/*
思路:
*使用一個順序循環(huán)隊(duì)列來存放元素
*SIZE的值為元素個數(shù)+1,用一個空位來存放rear指針
*若未到數(shù)m,則將隊(duì)頭元素放在隊(duì)尾,并使front后移一位
*若數(shù)到m,則將其出隊(duì),并輸出元素
*/
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)//進(jìn)行約瑟夫游戲
{
int num,a,b,j;
if(i!=1)//若位置不從第一個開始,則調(diào)整頭指針和尾指針的位置,使它們始終相鄰(即相當(dāng)于頭指針始終指向i,尾指針始終指向頭指針的前一個位置)
{
b=p->base[p->rear-1];//此處的p->rear-1是因?yàn)閷iT有一個空位置來存放尾指針
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);//將隊(duì)頭元素取出,并使頭指針后移一位
insert(p,a);//將取出的隊(duì)頭元素插入到隊(duì)尾
}
a=delelem(p,a);//若num=m,則刪除該元素(即出隊(duì))
printf("%d ",a);//輸出出隊(duì)的元素
if(p->front==p->rear)//若全部元素都已經(jīng)出隊(duì),則退出循環(huán)
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("請輸入元素個數(shù)n:");
scanf("%d",&n);
printf("請輸入m(數(shù)到m就退出):");
scanf("%d",&m);
printf("請輸入i(從第i個位置開始數(shù)):");
scanf("%d",&i);
SIZE=++n;//SIZE=++n是為了空出一個位置來存放rear指針
InitNode(&p);
for(j=1;j<=n;j++)
{
insert(&p,j);//使n個元素入隊(duì)
}
//print(&p);
test(&p,i,m);
return 0;
}
標(biāo)簽:隊(duì)列,約瑟夫,int,base,printf,front,C語言,rear,SIZE
來源: https://blog.csdn.net/qq_41032474/article/details/89715283
總結(jié)
以上是生活随笔為你收集整理的c语言 队列 游戏,循环队列实现约瑟夫游戏(C语言版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言抓取机器硬件阐述,c语言如何控制硬
- 下一篇: c语言骑士游历优化算法,骑士游历、骑士巡