簡體   English   中英

如何在C ++中正確刪除鏈接列表的節點

[英]How do I properly delete nodes of linked list in C++

我覺得好像我實際上並沒有刪除該節點並釋放內存。 我想我只是在移動指針,所以當我打印鏈接列表時,列表不會打印我刪除的元素。 所以我的問題是我實際上是刪除節點還是只是簡單地重新排列指針,以使我看起來像是刪除節點(本質上只是斷開鏈接,而不是刪除節點)? 感謝您的任何幫助。

void SLL::deleteNode(int target){
Node *current = new Node;
Node *previous = new Node;

for (current = front->next, previous = front; current != NULL; current = current->next, previous=previous->next){
    if (previous->data == target && previous == front){
        front = previous->next;
        delete[] previous;
        return;
    //This if statement deletes the element if its the front
    }

    else {

        if (previous->data == target && previous->next == NULL){
            previous = NULL;
            delete[] current;
            return;
        //This if statement deletes the node if it is the back
        }


        else if (current->data==target)
        {
            previous->next = current->next;
            delete[] current;
            return;
        //This if statement deletes a node if it is in the middle
        }
    }
    }

    delete[] current;
    delete[] previous;
}
Node *current  = new Node;
Node *previous = new Node;

此代碼會導致內存泄漏-您永遠不會刪除此內存。 您可以聲明沒有內存分配的指針:

Node *current  = nullptr;
Node *previous = nullptr;

delete將刪除指針的內存,因此您實際上將刪除Node。 但是對Node*使用delete [] 是不正確的 ,它僅應用於數組-用new[]分配的內存。 使用不當會導致不確定的行為。 因此,要正確刪除節點,請使用運算符delete刪除它們。

使用內存泄漏檢測工具可以知道程序中是否存在內存泄漏。

刪除列表元素的代碼:比如說,我們有pHead指向列表的頭部(但是如果您自己編寫此類內容,它會為您提供更多信息):

Node* pCur  = pHead;
Node* pPrev = pCur;

while (pCur && pCur->data != target) {
    pPrev = pCur;
    pCur  = pCur->next;
}

if (pCur==nullptr)  // not found
   return NOT_FOUND;

if (pCur == pHead) {   // first element matches
    pHead = pCur->next;
} else {
    pPrev->next = pCur->next;
}

// pCur now is excluded from the list

delete pCur;     // deallocate its memory

使用指針到指針的替代方法 (社區添加)

當你實際使用的指針列表進行枚舉以上可以接受新的光。 下面從pp開始,將頭指針(而不是它指向的節點;實際的指針本身) 的地址分配給pp 我們遍歷列表,直到pp保留指向要刪除目標的節點的指針的地址(可以是頭指針,可以是某個節點中的next指針,沒有區別)。 將要尋址的指針設置為其自己節點的next值,然后刪除目標節點。

確實應該在調試器中觀察它的運行方式,但是鑒於實際情況,該算法非常簡單:

Node **pp = &pHead;
while (*pp && (*pp)->data != target)
    pp = &(*pp)->next;

if (*pp)
{
    Node *victim = *pp;
    *pp = victim->next;
    delete victim;
}

這就是全部 這樣一來,您就可以去除頭節點,而無需特殊情況下免費使用。 希望這也會有所幫助。

暫無
暫無

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

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