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;
|
||
} |