1、向链表尾部增加一个节点
对应代码:
/***********************************************************************************
函数功能: 向链表添加一个节点, 从链表尾部加入.
入口参数: 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、向链表头部删掉一个节点
对应代码:
/***********************************************************************************
函数功能: 从链表删除一个节点, 从链表头部删除.
入口参数: 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、向链表指定的节点前插入一个节点
对应代码:
/***********************************************************************************
函数功能: 向链表指定的节点前插入一个节点.
入口参数: 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、删除链表指定的节点
对应代码:
/***********************************************************************************
函数功能: 从链表删除指定的节点, 并返回下个节点的指针.
入口参数: 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;
}
}