優(yōu)先級隊列中采用的鏈表結(jié)構(gòu)分析

1、向鏈表尾部增加一個節(jié)點

圖片.png

對應代碼:

/***********************************************************************************
函數(shù)功能: 向鏈表添加一個節(jié)點, 從鏈表尾部加入.
入口參數(shù): pstrList: 鏈表根節(jié)點指針.
          pstrNode: 加入的節(jié)點指針.
返 回 值: none.
***********************************************************************************/
void DlistNodeAdd(DLIST* pstrList, DLIST* pstrNode)
{
    /* 鏈表非空 */
    if(NULL != pstrList->pstrTail)
    {
        /* 新節(jié)點的頭指向原尾節(jié)點 */
        pstrNode->pstrHead = pstrList->pstrHead;

        /* 新節(jié)點的尾指向根節(jié)點 */
        pstrNode->pstrTail = pstrList;

        /* 原尾節(jié)點的尾指向新節(jié)點 */
        pstrList->pstrHead->pstrTail = pstrNode;

        /* 根節(jié)點的頭指向新加入的節(jié)點 */
        pstrList->pstrHead = pstrNode;
    }
    else /* 鏈表為空 */
    {
        /* 新節(jié)點的頭尾都指向根節(jié)點 */
        pstrNode->pstrHead = pstrList;
        pstrNode->pstrTail = pstrList;

        /* 根節(jié)點的頭尾都指向新節(jié)點 */
        pstrList->pstrHead = pstrNode;
        pstrList->pstrTail = pstrNode;
    }
}

2、向鏈表頭部刪掉一個節(jié)點

圖片.png

對應代碼:

/***********************************************************************************
函數(shù)功能: 從鏈表刪除一個節(jié)點, 從鏈表頭部刪除.
入口參數(shù): pstrList: 鏈表根節(jié)點指針.
返 回 值: 刪除的節(jié)點指針, 若鏈表為空則返回NULL.
***********************************************************************************/
DLIST* DlistNodeDelete(DLIST* pstrList)
{
    DLIST* pstrTempNode;

    /* 鏈表中的第一個節(jié)點 */
    pstrTempNode = pstrList->pstrTail;

    /* 鏈表非空 */
    if(NULL != pstrTempNode)
    {
        /* 鏈表中有多個節(jié)點 */
        if(pstrList->pstrHead != pstrList->pstrTail)
        {
            /* 根節(jié)點的尾指向第二個節(jié)點 */
            pstrList->pstrTail = pstrTempNode->pstrTail;

            /* 第二個節(jié)點的頭指向根節(jié)點 */
            pstrTempNode->pstrTail->pstrHead = pstrList;
        }
        else /* 鏈表中只有一個節(jié)點 */
        {
            /* 取出節(jié)點后鏈表為空 */
            pstrList->pstrHead = (DLIST*)NULL;
            pstrList->pstrTail = (DLIST*)NULL;
        }

        /* 返回取出的節(jié)點指針 */
        return pstrTempNode;
    }
    else /* 鏈表為空返回NULL */
    {
        return (DLIST*)NULL;
    }
}

3、向鏈表指定的節(jié)點前插入一個節(jié)點

圖片.png

對應代碼:

/***********************************************************************************
函數(shù)功能: 向鏈表指定的節(jié)點前插入一個節(jié)點.
入口參數(shù): pstrList: 鏈表根節(jié)點指針.
          pstrNode: 基準節(jié)點指針, 將新節(jié)點插到該節(jié)點前面.
          pstrNewNode: 新插入節(jié)點的指針.
返 回 值: none.
***********************************************************************************/
void DlistCurNodeInsert(DLIST* pstrList, DLIST* pstrNode,
                            DLIST* pstrNewNode)
{
    /* 基準節(jié)點不是根節(jié)點 */
    if(pstrList != pstrNode)
    {
        /* 基準節(jié)點的上個節(jié)點的尾指向新節(jié)點 */
        pstrNode->pstrHead->pstrTail = pstrNewNode;

        /* 新節(jié)點的頭指向基準節(jié)點的上個節(jié)點 */
        pstrNewNode->pstrHead = pstrNode->pstrHead;

        /* 新節(jié)點的尾指向基準節(jié)點 */
        pstrNewNode->pstrTail = pstrNode;

        /* 基準節(jié)點的頭指向新節(jié)點 */
        pstrNode->pstrHead = pstrNewNode;
    }
    else /* 基準節(jié)點是根節(jié)點 */
    {
        DlistNodeAdd(pstrList, pstrNewNode);
    }
}

4、刪除鏈表指定的節(jié)點

圖片.png

對應代碼:

/***********************************************************************************
函數(shù)功能: 從鏈表刪除指定的節(jié)點, 并返回下個節(jié)點的指針.
入口參數(shù): pstrList: 鏈表根節(jié)點指針.
         pstrNode: 要刪除的節(jié)點的指針.
返 回 值: 刪除節(jié)點的下個節(jié)點指針, 若沒有下個節(jié)點則返回NULL.
***********************************************************************************/
M_DLIST* MDS_DlistCurNodeDelete(M_DLIST* pstrList, M_DLIST* pstrNode)
{
   /* 要刪除的節(jié)點不是根節(jié)點 */
   if(pstrList != pstrNode)
   {
       /* 鏈表中有多個節(jié)點 */
       if((pstrNode->pstrHead != pstrList) || (pstrNode->pstrTail != pstrList))
       {
           /* 要刪除節(jié)點的上個節(jié)點的尾指向要刪除節(jié)點的下個節(jié)點 */
           pstrNode->pstrHead->pstrTail = pstrNode->pstrTail;

           /* 要刪除節(jié)點的下個節(jié)點的頭指向要刪除節(jié)點的上個節(jié)點 */
           pstrNode->pstrTail->pstrHead = pstrNode->pstrHead;

           /* 返回刪除節(jié)點的下個節(jié)點指針 */
           return pstrNode->pstrTail;
       }
       else /* 鏈表中只有一個節(jié)點 */
       {
           (void)MDS_DlistNodeDelete(pstrList);

           /* 沒有下個節(jié)點, 返回NULL */
           return (M_DLIST*)NULL;
       }
   }
   else /* 刪除根節(jié)點直接返回NULL */
   {
       return (M_DLIST*)NULL;
   }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容