C语言实现链表之单向链表(十)删除任意结点
上一篇文章给出了插入任意结点的函数,本篇文章将给出删除任意结点的函数。
/*==============================================================================
* 操作 :删除任意结点
* 操作前:ppHeadNode为链表的头指针的二级指针,name为链表中的数据元素关键字
* 操作后:结点被删除,操作成功返回TRUE,操作失败返回FALSE
==============================================================================*/
C_Bool DeletOtherNode(MyListNode** ppHeadNode, char* name)
{
MyListNode* pListNodeTmp1 = (*ppHeadNode);
MyListNode* pListNodeTmp2 = NULL;
int iCount = 0;
// 判断是否有链表输入
if((*ppHeadNode) == NULL)
{
fprintf(stderr, "There is no list.\n");
return FALSE;
}
// 找到要删除结点的位置
while(pListNodeTmp1 != NULL)
{
iCount++;
if(!(strcmp(name, pListNodeTmp1->sNodeData.cName)))
{
break;
}
pListNodeTmp2 = pListNodeTmp1; // 保存pListNodeTmp1的前一结点
pListNodeTmp1 = pListNodeTmp1->pNextNodeAddr;
}
// 没有在链表中找到关键字标志的结点
if(pListNodeTmp1 == NULL)
{
fprintf(stderr, "Sorry, can't find the node.\n");
return FALSE;
}
else if(iCount == 1)
{
// 删除的是头结点
DeletFirstNode(ppHeadNode);
return TRUE;
}
else if(pListNodeTmp1->pNextNodeAddr == NULL)
{
// 删除的是尾结点
DeletTailNode(ppHeadNode);
return TRUE;
}
// 执行删除和重新链接的操作
pListNodeTmp2->pNextNodeAddr = pListNodeTmp1->pNextNodeAddr;
free(pListNodeTmp1);
pListNodeTmp1 = NULL;
return TRUE;
}
(1)该函数通过调用DeletFirstNode()、DeletTailNode()实现了头结点或者尾结点的删除,其他结点的删除采取的是正常处理;
(2)该函数采用了我们自己定义的布尔变量;
(3)该函数依旧进行了错误判断和错误处理。