84 lines
2.7 KiB
C
84 lines
2.7 KiB
C
|
#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;
|
|||
|
}
|