#include <stdio.h>
#include <stdlib.h>
#include "cyclequeue.h"
/*****************************************************************
函数名:cycleQueue_create
功 能:创建一个循环队列
参 数:int maxsize 表示循环队列最多能够存储的元素个数
返回值:循环队列的指针
备 注:
*****************************************************************/
cycleQueue* cycleQueue_create(int maxsize)
{
if (maxsize <= 0) {
printf("[Line %d] %s 队列最大元素个数有误,创建失败!\n", __LINE__, __FUNCTION__);
return NULL;
}
//为循环队列结构分配空间
cycleQueue* q = malloc(sizeof(cycleQueue));
if (q == NULL) {
printf("[Line %d] %s 内存不足,创建失败!\n", __LINE__, __FUNCTION__);
return NULL;
}
//为循环队列的元素分配空间
q->data = malloc( maxsize * sizeof(elemType));
if (q->data == NULL) {
printf("[Line %d] %s 内存不足,创建失败!\n", __LINE__, __FUNCTION__);
return NULL;
}
q->front = q->rear = 0;
q->maxsize = maxsize;
q->cnt = 0;
return q;
}
/*****************************************************************
函数名:cycleQueue_destroy
功 能:销毁一个循环队列
参 数:cycleQueue* q 循环队列的指针
返回值:操作的成功或失败
备 注:
*****************************************************************/
BOOL cycleQueue_destroy(cycleQueue* q)
{
if (q == NULL) {
printf("[Line %d] %s 传入的参数为NULL!\n", __LINE__, __FUNCTION__);
return FALSE;
}
//释放队列元素的空间
free(q->data);
//释放队列结构的空间
free(q);
return TRUE;
}
/*****************************************************************
函数名:cycleEnQueue
功 能:循环队列的入队操作
参 数:cycleQueue* q 循环队列的指针
elemType val 待入队的数值
返回值:操作的成功或失败
备 注:
*****************************************************************/
BOOL cycleEnQueue(cycleQueue* q, elemType val)
{
if (q == NULL) {
printf("[Line %d] %s 传入的参数为NULL!\n", __LINE__, __FUNCTION__);
return FALSE;
}
判断队列是否已满
//if (q->cnt == q->maxsize) {
// printf("[Line %d] %s 队列已满,入队失败!\n", __LINE__, __FUNCTION__);
// return FALSE;
//}
//给rear对应的元素空间进行赋值
q->data[q->rear] = val;
q->rear = (q->rear + 1) % q->maxsize;
//队列元素数量+1
q->cnt += 1;
return TRUE;
}
/*****************************************************************
函数名:cycleDeQueue
功 能:循环队列的出队操作
参 数:cycleQueue* q 循环队列的指针
elemType *p_val 指向存储出列数据的空间
返回值:操作的成功或失败
备 注:
*****************************************************************/
BOOL cycleDeQueue(cycleQueue* q, elemType *p_val)
{
if (q == NULL || p_val == NULL) {
printf("[Line %d] %s 传入的参数为NULL!\n", __LINE__, __FUNCTION__);
return FALSE;
}
//判断队列是否为空
if (q->cnt == 0) {
printf("[Line %d] %s 队列为空,出队失败!\n", __LINE__, __FUNCTION__);
return FALSE;
}
//使用front对应的元素进行赋值
*p_val = q->data[q->front];
q->front = (q->front + 1) % q->maxsize;
//队列元素数量+1
q->cnt -= 1;
return TRUE;
}
头文件
#ifndef _CYCLEQUEUE_H_
#define _CYCLEQUEUE_H_
typedef int elemType;
typedef struct {
elemType* data; //指向用于存储队列元素的空间
int front; //表示首个元素的下标
int rear; //表示末尾元素的下一个位置的下标
int maxsize; //用于表示队列最大容量
int cnt; //用于当前队列元素个数
}cycleQueue;
typedef enum {
FALSE = 0,
TRUE,
}BOOL;
cycleQueue* cycleQueue_create(int maxsize);
BOOL cycleQueue_destroy(cycleQueue* q);
BOOL cycleEnQueue(cycleQueue* q, elemType val);
BOOL cycleDeQueue(cycleQueue* q, elemType* p_val);
#endif // !_CYCLEQUEUE_H_