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

论坛 期权论坛 脚本     
匿名网站用户   2020-12-19 18:41   20   0
/*循环队列*/
#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十分有用,可以帮助快速定位错误。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP