这段代码是一个简单的队列实现,包括入队列(LQueuePush)、出队列(LQueuePop)和获取队头元素地址(LQueueGetTop)等操作。具体的实现如下:
首先,有一个静态函数my_malloc用于分配空闲节点,并返回其地址。
static void* my_malloc(LQueue *pLQ)
{
U16 usIndex = 0;
for (usIndex = 0; usIndex < QUEUE_MAXLEN; usIndex++)
{
if (pLQ->beUsed[usIndex] == 0)
{
pLQ->beUsed[usIndex] = 1;
return &pLQ->QNodeBlank[usIndex];
}
}
return 0;
}
然后,有一个静态函数my_free用于释放已使用的节点。
static void my_free(LQueue *pLQ, void *pAdr)
{
U16 usIndex = 0;
for (usIndex = 0; usIndex < QUEUE_MAXLEN; usIndex++)
{
if (&pLQ->QNodeBlank[usIndex] == pAdr)
{
pLQ->beUsed[usIndex] = 0;
}
}
}
接下来是创建新节点的函数BuyLQNode,它会调用my_malloc来分配空间,并将数据存储到节点中。
static QNode *BuyLQNode(LQueue *ptLQ, CAN_MSG data)
{
QNode *ptLQNode = (QNode *)my_malloc(ptLQ);
if (NULL == ptLQNode)
{
return 0;
}
else
{
ptLQNode->data = data;
ptLQNode->_pNext = NULL;
}
return ptLQNode;
}
然后是入队列函数LQueuePush,它会调用BuyLQNode创建新节点,并将其插入到队列的尾部。
static void LQueuePush(LQueue *ptLQ, CAN_MSG data)
{
QNode* ptQnode;
ptQnode = BuyLQNode(ptLQ,data);
if (ptQnode != NULL)
{
if (NULL == ptLQ->pFront)
{
ptLQ->pFront = ptLQ->pRear = ptQnode;
}
else
{
ptLQ->pRear->_pNext = ptQnode;
ptLQ->pRear = ptLQ->pRear->_pNext;
}
ptLQ->usItemsNum++;
#if(JDB_DEBUG)
DEBUG_QueueLen++;
#endif
}
}
接下来是出队列函数 LQueuePop,它会释放队头节点,并将队头指针向后移动一个位置。
static void LQueuePop(LQueue *ptLQ)
{
QNode *pDel;
if (NULL == ptLQ->pFront)
{
return;
}
if (ptLQ->pFront == ptLQ->pRear) // 队列只有一个元素时的处理
{
ptLq -> pFront = NULL;
ptlq -> pRear= NULL;
}
pDel=ptlq- >pFront;
ptLq -> pFront=ptLq->pFront->_pNext;
my_free(ptLQ,pDel);
ptlq->usItemsNum--;
#if(JDB_DEBUG)
DEBUG_QueueLen--;
#endif
}
最后,是获取队头元素地址的函数 LQueueGetTop,它返回队头节点存储数据的地址。
static CAN_MSG* LQueueGetTop(LQueue *ptLQ)
{
return &(ptLQ->pFront->data);
}
这段代码实现了一个简单的队列数据结构,通过动态分配和释放节点来进行入队列和出队列操作。
内容由零声教学AI助手提供,问题来源于学员提问