1、删除指定节点
代码:
void DelteNode(struct Node* pTemp)//删除节点
{
//是不是头
if (pTemp == g_pHead)
{
//单节点链表
if (g_pHead == g_pEnd)
{
free(g_pHead);
g_pHead = NULL;
g_pEnd = NULL;
}
//多节点链表
else
{
//记录头
struct Node* pT = g_pHead;
//头往下走
g_pHead = g_pHead->pNext;
//头前设置为NULL
g_pHead->pPre = NULL;
//释放
free(pT);
}
g_iNodeCount– ;
}
//尾删除
else if (pTemp == g_pEnd)
{
//记录尾
struct Node* pT = g_pEnd;
//尾往前走
g_pEnd = g_pEnd->pPre;
//尾后设置为NULL
g_pEnd->pNext = NULL;
//释放
free(pT);
//节点减一
g_iNodeCount– ;
}
//中间删除
else
{
//链接前后节点
//前节点指向后节点
(pTemp->pPre)->pNext = pTemp->pNext;
//后节点指向前节点
(pTemp->pNext)->pPre = pTemp->pPre;
//节点减一
g_iNodeCount– ;
}
}
功能:
删除双向链表中的指定节点,处理了三种情况:删除头节点、删除尾节点和删除中间节点。函数通过调整前后节点的指针关系完成删除操作,并维护全局变量g_pHead(链表头)、g_pEnd(链表尾)和g_iNodeCount(节点计数)。
步骤:
头节点删除逻辑
当pTemp是头节点时,需判断链表是否只有一个节点。若是,直接释放并置空g_pHead和g_pEnd;否则更新头节点为原头节点的下一个节点,并断开新头节点的前驱指针。
尾节点删除逻辑
当pTemp是尾节点时,更新尾节点为原尾节点的前驱节点,并断开新尾节点的后继指针,最后释放原尾节点。
中间节点删除逻辑
调整目标节点的前驱节点的pNext指向目标节点的后继节点,同时调整后继节点的pPre指向目标节点的前驱节点,完成链表连接后释放目标节点。
2、根据下标删除
代码:
void DeleteNodeByIndex(int iIndex)//根据下标删除
{
//查找节点
struct Node* pTemp = GetByIndex(iIndex);
//判断是否找到
if (pTemp != NULL)
{
//找到了直接删除
DelteNode(pTemp);
}
}
功能:
根据下标删除链表节点的
步骤:
查找节点
调用下标查询函数,传入指定下标,得到指定节点。
删除节点
确认节点找到,找到了就调用节点删除函数。
调用:
DeleteNodeByIndex(5);
DeleteNodeByIndex(0);
DeleteNodeByIndex(2);

3、删除所有指定数据的节点
代码:
void DeleteByData(int iValue)//删除所有指定数据的节点
{
while (1)
{
//找
struct Node* pTemp = GetByData(iValue);
if (NULL == pTemp)
break;
DelteNode(pTemp);
}
}
功能:
删除链表中所有包含指定数据值的节点。
步骤:
循环查找与删除
- 调用 GetByData(iValue) 函数查找链表中第一个数据值等于 iValue 的节点,返回节点指针 pTemp。
- 若 pTemp 为 NULL,说明链表中无更多匹配节点,循环终止。
- 若 pTemp 非空,调用 DelteNode(pTemp) 删除该节点,继续循环查找下一个匹配节点。
调用:
DeleteByData(6);

网硕互联帮助中心






评论前必须登录!
注册