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
總結
以上是生活随笔為你收集整理的c语言 队列 游戏,循环队列实现约瑟夫游戏(C语言版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言抓取机器硬件阐述,c语言如何控制硬
- 下一篇: c语言骑士游历优化算法,骑士游历、骑士巡