循环队列(解决顺序队列的假溢出现象)(基于C语言)

/*循环队列*/
#include 
#include 

#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十分有用,可以帮助快速定位错误。

你可能感兴趣的:(数据结构与算法)