在c ++中从链表中删除节点

时间:2013-01-07 21:36:36

标签: c++ visual-c++ linked-list

我正在努力学习C ++,而且我有一点混乱。

我正在学习的文本告诉我,如果我想删除类型const T&的节点,我应该首先创建该节点类型的新指针,然后使用内置的C ++ {{1}删除它}。但是,如果我只是设置从待删除节点的前一个元素到要删除的节点的下一个元素的链接会发生什么?类似的东西:

delete[]

或者这会导致内存泄漏吗?

我很困惑,因为我读到了其他地方永远不会删除指针,但是我正在使用的示例代码有以下几点:

*p = node.previous;
p-> next = node.next;

删除节点的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

假设您的节点如下所示:

struct Node
{
    Node*  previous;
    Node*  next;

    SomeType data;
};

然后:

*p = node.previous;
p-> next = node.next;

然后。这将导致内存泄漏 它还使p->next->prev指向错误的节点。

  

我感到很困惑,因为我读到的其他地方永远不会删除指针,但我正在使用的示例代码有以下几点:

是的,最好的方法是永远不要删除指针"。但这必须伴随一些背景。您不应该手动删除指针,因为指针应该由控制其生命周期的对象管理。这些对象中最简单的是智能指针或容器。但是对于这种情况来说太过分了(因为你正在创建容器)。

在创建容器(列表)时,您需要自己进行管理(注意C ++已经有一些丢失类型std :: list,用于类型为t的值列表或者对于a的boost :: ptr_list指向T)的指针列表。但尝试自己动手是一个很好的练习。

以下是关于初学者制作列表及其生成的评论的代码审核示例:

http://codereview.stackexchange.comLinked list in C++

我希望这有助于解释如何创建和删除对象。

答案 1 :(得分:1)

Node* p = new Node; // This is how you allocate a node
delete p; // This is how you delete it

delete []运算符应该用于动态分配的数组

Node* nodelist = new Node[ 4 ]; // nodelist is now a (dynamically allocated) array with 4 items.
delete[] nodelist; // Will delete all 4 elements (which is actually just one chunk of memory)

答案 2 :(得分:0)

void deleteNode( Node * p )
{
    Node * temp = p->next;
    p->data = p->next->data;
    p->next = temp->next;
    free(temp);
}

这是几个月前我做过的事情。

template <class T>
T LinkedList<T>::remove(int pos)
{
    if (pos < 1 || pos > size)
    {
        throw pos;
    }
    ListNode * temp;
    if (pos == 1)
    {
        temp=head;
        head = head->next;
    }
    else
    {
        int i=1;
        ListNode * prev = head;

        while(i<pos-1)
        {
            i++;
            prev=prev->next;
        }
        temp = prev->next;

        prev->next = (prev->next)->next;

    }
    --size;
    return temp->item;
}

答案 3 :(得分:0)

直接删除Node只有在Node实现析构函数更新周围previous个实例的nextNode指针时才有意义,例如:

Node::~Node()
{
    if (previous) previous->next = next;
    if (next) next->previous = previous;
}

Node *p = node-to-be-deleted;
delete p;

否则,您必须先更新Node指针,然后再删除相关的Node,例如:

Node *p = node-to-be-deleted;
if (p->previous) p->previous->next = p->next;
if (p->next) p->next->previous = p->previous;
delete p;

话虽如此,最好的方法是不要手动实现链接列表。在C ++中,改为使用std::list容器,让它为您处理这些细节。