优先级队列中采用的链表结构分析

1、向链表尾部增加一个节点

优先级队列中采用的链表结构分析_第1张图片
图片.png

对应代码:

/***********************************************************************************
函数功能: 向链表添加一个节点, 从链表尾部加入.
入口参数: pstrList: 链表根节点指针.
          pstrNode: 加入的节点指针.
返 回 值: none.
***********************************************************************************/
void DlistNodeAdd(DLIST* pstrList, DLIST* pstrNode)
{
    /* 链表非空 */
    if(NULL != pstrList->pstrTail)
    {
        /* 新节点的头指向原尾节点 */
        pstrNode->pstrHead = pstrList->pstrHead;

        /* 新节点的尾指向根节点 */
        pstrNode->pstrTail = pstrList;

        /* 原尾节点的尾指向新节点 */
        pstrList->pstrHead->pstrTail = pstrNode;

        /* 根节点的头指向新加入的节点 */
        pstrList->pstrHead = pstrNode;
    }
    else /* 链表为空 */
    {
        /* 新节点的头尾都指向根节点 */
        pstrNode->pstrHead = pstrList;
        pstrNode->pstrTail = pstrList;

        /* 根节点的头尾都指向新节点 */
        pstrList->pstrHead = pstrNode;
        pstrList->pstrTail = pstrNode;
    }
}

2、向链表头部删掉一个节点

优先级队列中采用的链表结构分析_第2张图片
图片.png

对应代码:

/***********************************************************************************
函数功能: 从链表删除一个节点, 从链表头部删除.
入口参数: pstrList: 链表根节点指针.
返 回 值: 删除的节点指针, 若链表为空则返回NULL.
***********************************************************************************/
DLIST* DlistNodeDelete(DLIST* pstrList)
{
    DLIST* pstrTempNode;

    /* 链表中的第一个节点 */
    pstrTempNode = pstrList->pstrTail;

    /* 链表非空 */
    if(NULL != pstrTempNode)
    {
        /* 链表中有多个节点 */
        if(pstrList->pstrHead != pstrList->pstrTail)
        {
            /* 根节点的尾指向第二个节点 */
            pstrList->pstrTail = pstrTempNode->pstrTail;

            /* 第二个节点的头指向根节点 */
            pstrTempNode->pstrTail->pstrHead = pstrList;
        }
        else /* 链表中只有一个节点 */
        {
            /* 取出节点后链表为空 */
            pstrList->pstrHead = (DLIST*)NULL;
            pstrList->pstrTail = (DLIST*)NULL;
        }

        /* 返回取出的节点指针 */
        return pstrTempNode;
    }
    else /* 链表为空返回NULL */
    {
        return (DLIST*)NULL;
    }
}

3、向链表指定的节点前插入一个节点

优先级队列中采用的链表结构分析_第3张图片
图片.png

对应代码:

/***********************************************************************************
函数功能: 向链表指定的节点前插入一个节点.
入口参数: pstrList: 链表根节点指针.
          pstrNode: 基准节点指针, 将新节点插到该节点前面.
          pstrNewNode: 新插入节点的指针.
返 回 值: none.
***********************************************************************************/
void DlistCurNodeInsert(DLIST* pstrList, DLIST* pstrNode,
                            DLIST* pstrNewNode)
{
    /* 基准节点不是根节点 */
    if(pstrList != pstrNode)
    {
        /* 基准节点的上个节点的尾指向新节点 */
        pstrNode->pstrHead->pstrTail = pstrNewNode;

        /* 新节点的头指向基准节点的上个节点 */
        pstrNewNode->pstrHead = pstrNode->pstrHead;

        /* 新节点的尾指向基准节点 */
        pstrNewNode->pstrTail = pstrNode;

        /* 基准节点的头指向新节点 */
        pstrNode->pstrHead = pstrNewNode;
    }
    else /* 基准节点是根节点 */
    {
        DlistNodeAdd(pstrList, pstrNewNode);
    }
}

4、删除链表指定的节点

优先级队列中采用的链表结构分析_第4张图片
图片.png

对应代码:

/***********************************************************************************
函数功能: 从链表删除指定的节点, 并返回下个节点的指针.
入口参数: pstrList: 链表根节点指针.
         pstrNode: 要删除的节点的指针.
返 回 值: 删除节点的下个节点指针, 若没有下个节点则返回NULL.
***********************************************************************************/
M_DLIST* MDS_DlistCurNodeDelete(M_DLIST* pstrList, M_DLIST* pstrNode)
{
   /* 要删除的节点不是根节点 */
   if(pstrList != pstrNode)
   {
       /* 链表中有多个节点 */
       if((pstrNode->pstrHead != pstrList) || (pstrNode->pstrTail != pstrList))
       {
           /* 要删除节点的上个节点的尾指向要删除节点的下个节点 */
           pstrNode->pstrHead->pstrTail = pstrNode->pstrTail;

           /* 要删除节点的下个节点的头指向要删除节点的上个节点 */
           pstrNode->pstrTail->pstrHead = pstrNode->pstrHead;

           /* 返回删除节点的下个节点指针 */
           return pstrNode->pstrTail;
       }
       else /* 链表中只有一个节点 */
       {
           (void)MDS_DlistNodeDelete(pstrList);

           /* 没有下个节点, 返回NULL */
           return (M_DLIST*)NULL;
       }
   }
   else /* 删除根节点直接返回NULL */
   {
       return (M_DLIST*)NULL;
   }
}

你可能感兴趣的:(优先级队列中采用的链表结构分析)