ZBLOG

static void* my_malloc(LQueue *pLQ) { U16 usIndex=0; for(usIndex=0;usIndexbeUsed[usIndex] == 0) { pLQ->beUsed[usIndex] = 1; return &pLQ->QNodeBlank[usIndex]; } } return 0; } static void my_free(...

这段代码是一个简单的队列实现,包括入队列(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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=18325

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?