循環キューの c 実装に問題があります。エンキュー操作が正しく機能していません。値は配列で初期化されていません。
キューの構造は次のとおりです。
typedef struct
{
int a[5];
int tail;
int head;
int cap;
}Que;
エンキュー関数:
int enque(Que *q,int num)
{
if((q->head)==(q->tail ))
return -1;
if(q->head==-1)
q->head=0;
q->a[q->tail]=num;
(q->tail) ++;
if(q->tail ==q->cap)
q->tail=0;
return 0;
}
デキュー関数:
int deque(Que *q)
{
if((q->head)==-1)
return -1;
int b= q->a[q->head];
(q->head)++;
if(q->head==q->cap)
q->head=0;
if(q->head==q->tail)
q->head=-1;
return b;
}
head はデキューされるインデックスの位置で、tail は要素を追加する必要があるインデックスです。head の初期値は -1 、 tail は 0 、 cap は 5 です。これらの値は別の関数によって設定されています。
@Klas Lindbäck完全なコードは次のとおりです。
#include <stdlib.h>
#include <stdio.h>
typedef struct
{
int a[5];
int tail;
int head;
int cap;
}Que;
int deque(Que *q)
{
if((q->head)==-1)
return -1;
int b= q->a[q->head];
(q->head)++;
if(q->head==q->cap)
q->head=0;
if(q->head==q->tail)
q->head=-1;
return b;
}
void initialize(Que *q)
{
q->head=-1;
q->tail=0;
q->cap=5;
}
int enque(Que *q,int num)
{
if((q->head)==(q->tail ))
return -1;
if(q->head==-1)
q->head=0;
q->a[q->tail]=num;
printf("%d \n",q->a[q->tail]);
(q->tail) ++;
if(q->tail ==q->cap)
q->tail=0;
return 0;
}
int main()
{
Que q;
initialize(&q);
int i=1;
for(;i<=5;i++)
{
int num;
printf("input a number: ");
scanf("%d",num);
enque(&q,num);
}
int c=q.a[0];
printf("%d %d %d\n",q.a[2],c,q.a[3]);
}