云计算百科
云计算领域专业知识百科平台

数据结构——双向链表的删除(十一)

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);

赞(0)
未经允许不得转载:网硕互联帮助中心 » 数据结构——双向链表的删除(十一)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!