1穆壕、向鏈表尾部增加一個節(jié)點
對應(yīng)代碼:
/***********************************************************************************
函數(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é)點
對應(yīng)代碼:
/***********************************************************************************
函數(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é)點
對應(yīng)代碼:
/***********************************************************************************
函數(shù)功能: 向鏈表指定的節(jié)點前插入一個節(jié)點.
入口參數(shù): pstrList: 鏈表根節(jié)點指針.
pstrNode: 基準(zhǔn)節(jié)點指針, 將新節(jié)點插到該節(jié)點前面.
pstrNewNode: 新插入節(jié)點的指針.
返 回 值: none.
***********************************************************************************/
void DlistCurNodeInsert(DLIST* pstrList, DLIST* pstrNode,
DLIST* pstrNewNode)
{
/* 基準(zhǔn)節(jié)點不是根節(jié)點 */
if(pstrList != pstrNode)
{
/* 基準(zhǔn)節(jié)點的上個節(jié)點的尾指向新節(jié)點 */
pstrNode->pstrHead->pstrTail = pstrNewNode;
/* 新節(jié)點的頭指向基準(zhǔn)節(jié)點的上個節(jié)點 */
pstrNewNode->pstrHead = pstrNode->pstrHead;
/* 新節(jié)點的尾指向基準(zhǔn)節(jié)點 */
pstrNewNode->pstrTail = pstrNode;
/* 基準(zhǔn)節(jié)點的頭指向新節(jié)點 */
pstrNode->pstrHead = pstrNewNode;
}
else /* 基準(zhǔn)節(jié)點是根節(jié)點 */
{
DlistNodeAdd(pstrList, pstrNewNode);
}
}
4喇勋、刪除鏈表指定的節(jié)點
對應(yīng)代碼:
/***********************************************************************************
函數(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;
}
}