forked from gary/ems
2
0
Fork 0
sun_ems/ems_c/bsp/bsp_msgQueue.c

84 lines
2.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "bsp_msgQueue.h"
/*****************************************************************************
* @brief 初始化队列,将队列头和队尾指针设置为 NULL
* @param[in] Queue *queue 指向需要初始化的队列的指针
* @return void
*****************************************************************************/
void initQueue(Queue *queue)
{
queue->head = NULL;
queue->tail = NULL;
// 无需在此设置 topic因为每个节点有各自的 topic。
}
/*****************************************************************************
* @brief 检查队列是否为空
* @param[in] Queue *queue 指向队列的指针
* @return int 如果队列为空返回1否则返回0
*****************************************************************************/
int isQueueEmpty(Queue *queue)
{
return queue->head == NULL;
}
/*****************************************************************************
* @brief 将现有的节点入队到队列的末尾
* @param[in] Queue *queue 指向队列的指针
* QueueNode *queueNode 要入队的节点
* @return void
*****************************************************************************/
void enqueue(Queue *queue, QueueNode *queueNode)
{
// 确保传入的节点和队列都不为空
if (queueNode == NULL)
{
fprintf(stderr, "Cannot enqueue a null node.\n");
return;
}
// 新节点的下一个指针应为空,以断开其与任何之前队列的连接
queueNode->next = NULL;
// 如果队列为空,则新节点为队列的头和尾
if (queue->tail == NULL)
{
queue->head = queueNode;
queue->tail = queueNode;
}
else
{
// 将新节点链接到当前尾节点的下一个,并更新队列的尾指针
queue->tail->next = queueNode;
queue->tail = queueNode;
}
}
/*****************************************************************************
* @brief 从队列的头部删除一个节点并返回其数据
* @param[in] Queue *queue 指向队列的指针
* @return char* 被删除节点的数据字符串(需要用户自己释放)
* 如果队列为空返回NULL
*****************************************************************************/
char *dequeue(Queue *queue)
{
if (isQueueEmpty(queue))
{
fprintf(stderr, "Queue is empty\n");
return NULL;
}
QueueNode *node = queue->head;
char *value = node->data;
queue->head = node->next;
if (queue->head == NULL)
{
queue->tail = NULL;
}
if (node->topic != NULL)
{
printf("Node Topic: %s\n", node->topic);
free(node->topic);
}
free(node);
return value;
}