C语言数据结构———循环消息队列,数组方式实现

参考内容




消息队列数据类型结构体


typedef struct
{
    u16 Type; /* 消息类型 */
    u16 Data; /* 消息值 */
}xSuper_Message_TypeDef;

typedef struct
{       
    u8 Front, Rear;                   //队首 队尾
    u8 Size;                          //大小
    xSuper_Message_TypeDef * pMsgDat; //数据指针
}xSuper_MesgQueue_TypeDef;




一、初始化消息队列

在这里插入图片描述


/* 初始化消息队列 */
void vMesgQueue_Init(xSuper_MesgQueue_TypeDef * pQueue, xSuper_Message_TypeDef * pMesg, u8 size)
{
    pQueue->Front   = pQueue->Rear = 0;
    pQueue->Size    = size;
    pQueue->pMsgDat = pMesg;
}



二、消息队列是否为空

在这里插入图片描述


/* 消息队列是否为空 */
u8 xMesgQueue_IsEmpty(xSuper_MesgQueue_TypeDef * pQueue)
{
    /* 队首与队尾相等队列为空 */
    if (pQueue->Front == pQueue->Rear) return 1;
    else                               return 0;
}



三、消息队列是否已满

在这里插入图片描述


/* 消息队列是否已满 */
u8 xMesgQueue_IsFull(xSuper_MesgQueue_TypeDef * pQueue)
{
    /* 队尾下一个元素为队首队列已满 */
    if (((pQueue->Rear + 1) % pQueue->Size) == pQueue->Front) return 1;
    else                                                      return 0;
}



四、消息入队

在这里插入图片描述


/* 消息入队 */
static void vSuper_MesgQueue_Enter(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData)
{
    pQueue->pMsgDat[pQueue->Rear].Type = msgType;
    pQueue->pMsgDat[pQueue->Rear].Data = msgData;
    pQueue->Rear = (pQueue->Rear + 1) % pQueue->Size;
}


/* 消息入队 */
u8 xMesgQueue_Enter(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData)
{
    /* 队列已满 */
    if (xMesgQueue_IsFull(pQueue)) return 1;

   /* 消息入队 */
    vSuper_MesgQueue_Enter(pQueue, msgType, msgData);

    return 0;
}




/* 获取队尾前索引 */
static u16 xSuper_MesgQueue_RearBeforIndex(xSuper_MesgQueue_TypeDef * pQueue)
{
    return ((pQueue->Rear - 1 + pQueue->Size) % pQueue->Size);
}


/* 强制消息入队 */
void vMesgQueue_Enter_Force(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData)
{
    u8 i = 0;

    /* 队列已满 */
    if (xMesgQueue_IsFull(pQueue)) 
    {
        i = xSuper_MesgQueue_RearBeforIndex(pQueue);
        pQueue->pMsgDat[i].Type = msgType;
        pQueue->pMsgDat[i].Data = msgData;
    }
    else                           
    {
        vSuper_MesgQueue_Enter(pQueue, msgType, msgData);
    }
}



五、消息出队

在这里插入图片描述


/* 消息出队 */
static xSuper_Message_TypeDef * xSuper_MesgQueue_Output(xSuper_MesgQueue_TypeDef * pQueue)
{
    xSuper_Message_TypeDef * pMsg = NULL;

    pMsg = &pQueue->pMsgDat[pQueue->Front];
    pQueue->Front = (pQueue->Front + 1) % pQueue->Size;

    return pMsg;
}


/* 消息出队 */
xSuper_Message_TypeDef * xMesgQueue_Output(xSuper_MesgQueue_TypeDef * pQueue)
{
    /* 队列为空 */
    if (xMesgQueue_IsEmpty(pQueue)) return NULL;

    /* 消息出队 */
    return xSuper_MesgQueue_Output(pQueue);
}



六、其他函数


/* 获取消息队列元素个数 */
u16 xMesgQueue_GetCount(xSuper_MesgQueue_TypeDef * pQueue)
{
    return ((pQueue->Rear - pQueue->Front + pQueue->Size) % pQueue->Size);
}


/* 清除消息队列 */
void vMesgQueue_Clear(xSuper_MesgQueue_TypeDef * pQueue)
{
    pQueue->Front = pQueue->Rear = 0;
}



七、函数汇总


void vMesgQueue_Init(xSuper_MesgQueue_TypeDef * pQueue, xSuper_Message_TypeDef * pMesg, u8 size);
void vMesgQueue_Enter_Force(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData);
void vMesgQueue_Clear(xSuper_MesgQueue_TypeDef * pQueue);


u8 xMesgQueue_Enter(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData);
u8 xMesgQueue_IsEmpty(xSuper_MesgQueue_TypeDef * pQueue);
u8 xMesgQueue_IsFull(xSuper_MesgQueue_TypeDef * pQueue);


xSuper_Message_TypeDef * xMesgQueue_Output(xSuper_MesgQueue_TypeDef * pQueue);
u16 xMesgQueue_GetCount(xSuper_MesgQueue_TypeDef * pQueue);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值