/*循环队列*/
#include <stdio.h>
#include <stdlib.h>
#define MAX_QUEUE_CYCLE_SIZE 10
typedef struct queue_cycle{
int *base; //保存数组基地址
int f;
int r;
int queue_cycle_size;
}node, *queue_cycle;
int
queue_cycle_init(queue_cycle *Q, int size)
{
node *p;
int *q;
p = (node *)malloc(sizeof(node));
if( p == NULL ){
printf("qeue_cycle init failed\n");
return -1;
}
p->f = p->r = 0;
q = (int *)malloc(size*sizeof(int));
if( q == NULL ){
printf("qeue_cycle init failed\n");
return -1;
}
p->base = q;
*Q = p; //注意这里传入的是二重指针要把队列的数据结构地址赋值给Q
return 0;
}
int
queue_cycle_en(queue_cycle *Q, int value)
{
queue_cycle q = *Q;
if( (q->r + 1)%MAX_QUEUE_CYCLE_SIZE == q->f)
return -1;
q->base[q->r] = value;
q->r = (q->r + 1)%MAX_QUEUE_CYCLE_SIZE;
return 0;
}
int
queue_cycle_d(queue_cycle *Q)
{
int value;
queue_cycle q = *Q;
if( q->r == q->f)
return -1;
value = q->base[q->f];
q->f = (q->f +1)%MAX_QUEUE_CYCLE_SIZE;
return value;
}
int
main(void)
{
int i, value;
queue_cycle Q = NULL;
queue_cycle_init(&Q, MAX_QUEUE_CYCLE_SIZE);
for(i = 0; i < MAX_QUEUE_CYCLE_SIZE; i++){
queue_cycle_en(&Q, i);
value = queue_cycle_d(&Q);
printf("%d ", value);
}
printf("\n");
return 0;
}
结果:
循环队列实际就是顺序队列的加强板,解决假溢出现象,但是在判断是否为满时牺牲了一个空间作为判断条件。
注意出队列时不能free,否则会造成“队列空洞”现象。
调试用gdb十分有用,可以帮助快速定位错误。