循环队列
功能实现
/**************************************************************************** * @name* @author* @date** *CopyRight (c) 2025-2026 All Right Reserved* *************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>typedef int DataType_t; //用户自定义类型//定义结构体记录队列
typedef struct Circularqueue
{DataType_t * Addr; //队列首地址unsigned int Size; //队列容量int Front; //队列首下标int Rear; //队列尾下标}CirQueue_t; //别名 /**************************************************************************** * @name CirQueue_Create* @brief 初始化队列* @param * * @retval point** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
CirQueue_t * CirQueue_Create(unsigned int size)
{CirQueue_t *Manager = (CirQueue_t *)calloc(1,sizeof(CirQueue_t)); //申请堆内存,用于管理体//判断堆内存是否申请成功if (NULL == Manager){perror("calloc memory for Manager is failled");exit(-1); //失败退出程序}Manager->Addr = (DataType_t *)calloc(size,sizeof(DataType_t)); //为列表申请堆内存//判断堆内存是否申请成功if (NULL == Manager->Addr){perror("calloc memory for element is failled");free(Manager); //失败后释放管理体内存exit(-1);}Manager->Size = size; //列表容量Manager->Front = 0; //列表首下标Manager->Rear = 0; //列表尾下标return Manager; //返回用于管理体内存地址
}/**************************************************************************** * @name CirQueue_Create* @brief 判断队列是否为满* @param * * @retval bool** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
bool CirQueue_IsFull(CirQueue_t *Manager)
{return (Manager->Rear+1%Manager->Size == Manager->Front) ? true : false; //已满返回true,未满返回false
}/**************************************************************************** * @name CirQueue_Create* @brief 判断队列是否为空* @param * * @retval bool** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
bool CirQueue_IsEmpty(CirQueue_t *Manager)
{return Manager->Front == Manager->Rear ? true : false; //已空返回true
}/**************************************************************************** * @name enqueue* @brief 入队* @param * * @retval bool** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
bool enqueue(CirQueue_t *Manager , DataType_t Data)
{if (CirQueue_IsFull(Manager)) //判断队列是否已满{ printf("\nCirQueue is full"); //队列已满,退出此函数return false; }Manager->Addr[Manager->Rear] = Data; //入队 Manager->Rear = (Manager->Rear+1)%Manager->Size; //队尾指针后移return true;
}/**************************************************************************** * @name dequeue* @brief 出队* @param * * @retval DataType_t** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
DataType_t dequeue(CirQueue_t *Manager)
{int Temp = 0; //定义变量记录下标//判断列表是否为空,列表为空,退出此函数if (CirQueue_IsEmpty(Manager)){printf("\nCirQueue is Empty"); return false;} Temp = Manager->Addr[Manager->Front]; //出队Manager->Front = (Manager->Front+1)%Manager->Size; //指针后移return Temp;}
主函数
int main(int argc , const char *argv[])
{CirQueue_t *Manager = CirQueue_Create(6);enqueue(Manager,1); enqueue(Manager,3); enqueue(Manager,5);printf("%d",dequeue(Manager)); enqueue(Manager,7); enqueue(Manager,9); enqueue(Manager,2); enqueue(Manager,4); }
运行结果
1
CirQueue is full