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