簡體   English   中英

指針超出我不希望的范圍

[英]Pointer to pointer going out of scope in a way that I don't want it to

我有一個用於在二分搜索樹中找到指定節點以及該節點先前節點的功能:

bool collection::removeFromTree(const char name[])
{
    treeNode ** prev = nullptr;
    for (treeNode ** curr = &root; *curr;)
    {
        int8_t result = strcmp(name, (*curr)->item->getName());
        if (result == 0)
        {
            deleteNode(prev, curr);
            return true;
        }
        else if (result < 0)
        {
            prev = curr;
            curr = &((*curr)->left);
        }
        else if (result > 0)
        {
            prev = curr;
            curr = &((*curr)->right);
        }
    }
    return false;
}

我遇到的問題不在於此函數,而deleteNode()我的deleteNode()函數。 我無法分配我的上一個節點指向當前節點(或我打算刪除的節點)之后的節點。 這是我的deleteNode()函數的重要部分:

void collection::deleteNode(treeNode **& prevNode, treeNode **& goneNode)
{
    //irrelevant code
    //if it has right child
    if (!(*goneNode)->left)
    {
        treeNode * temp = (*goneNode)->right;
        (*goneNode)->right = nullptr;
        delete *goneNode;
        (*prevNode)->right = temp;
        *goneNode = nullptr;
    }
    //irrelevant code
}

當然,問題在於此函數運行后(*prevNode)->right變為null 指向該指針的指針超出范圍,並且數據丟失。 在goedNode右邊的任何節點都超出范圍。 有什么好的方法可以解決此問題?

我也嘗試過:

void collection::deleteNode(treeNode **& prevNode, treeNode **& goneNode)
{
    //irrelevant code
    //if it has right child
    if (!(*goneNode)->left)
    {
        (*prevNode)->right = (*goneNode)->right;
        (*goneNode)->right = nullptr;
        delete *goneNode;
        *goneNode = nullptr;
    }
    //irrelevant code
}

當我這樣做時,在delete *goneNode;之后, (*prevNode)->right變為null delete *goneNode; (在函數執行完成之前)。

這里使用兩星指針的好處是避免使用current指針和previous指針。 具有指向節點的指針的指針,我們可以編輯將節點綁定到樹中的鏈接。 上一個節點的其余部分無關緊要; 我們只關心指向我稱之為bad_node (要刪除的bad_node的指針。

(*prevNode)->right = (*goneNode)->right; //50% chance that (*prevNode)->right was (*goneNode)

無論是bad_node是右側prevNode ,我們抹去的位置bad_node ,或者它的左側和我們毀傷樹。 我相信在您的情況下,第一個正在發生。 一旦執行該行, *goneNode值將是錯誤的,因此最終會泄漏goneNode並刪除其子級。

扯開自己

else if (!(*goneNode)->left) //one child on right
{
    treeNode* temp = *goneNode; //store address of bad_node
    *goneNode = (*goneNode)->right; //replace bad_node with child
    temp->right = nullptr; //bad_node now has no children
    delete temp; //delete bad_node
}

要記住的重要一點是, *goneNode是將指針bad_node 分配給*goneNode更改樹的結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM