当前位置: 首页 > 知识库问答 >
问题:

如何在双向链表中实现擦除方法

江德海
2023-03-14

我必须编写一个双链接列表,我正在尝试实现erase(Type obj)方法,该方法接受一个参数obj,遍历列表并删除包含元素obj的每个节点。

我面临的问题是,我从前面遍历链表,当我找到包含obj元素的节点时,我会在包含obj元素的节点前后更改节点的下一个/上一个指针。然而,我并没有删除带有obj本身的节点,据我所知,c没有垃圾收集,所以带有obj的节点仍然悬在空中。我如何删除它?

我的擦除()

template <typename Type>
int Double_list<Type>::erase( Type const &obj ) {
if (empty()){
    return 0;
}
if (size() == 1 && head()->retrieve() == obj){
    list_head = nullptr;
    list_tail = nullptr;
    list_size--;
    return 1;
}

//Counter to hold the number of items deleted
int count = 0;
    //Iterating through the linked list
for (Double_node<Type> *ptr = head(); ptr != nullptr; ptr = ptr->next()){
    if (ptr->retrieve() == obj){
        ptr->previous_node->next_node = ptr->next();
        ptr->next()->previous_node = ptr->previous();
        count++;
        // delete ptr; // This stops me from iterating through the for loop
        list_size--;
    }
}
return count;
}

共有2个答案

史弘致
2023-03-14

删除指针和对象时有一种称为delete的语法。示例代码:

obj *temp = getCurrentNode();
//set pointers in nodes to the correct places
delete temp; //This releases all of the memory used in the object back to the OS
temp = NULL;//good practice to set this to null, since it points to non-allocated memory
//but exiting the function will make the pointer 'temp' useless, anyway.
弘焕
2023-03-14

当你遍历你的列表时,你正在使用指向节点的指针,它的类型是Double_node

Double_node<Type> *ptr_next = 0;
for (Double_node<Type> *ptr = head(); ptr != nullptr; ptr = ptr_next) {
     ptr_next = ptr->next ();
     if (ptr->retrieve() == obj){
     if (ptr->previous_node)
       ptr->previous_node->next_node = ptr->next();

     ptr->next()->previous_node = ptr->previous();
     count++;
     list_size--;
     delete ptr;
    }

我相信这应该能奏效。

 类似资料:
  • 本文向大家介绍C#双向链表LinkedList排序实现方法,包括了C#双向链表LinkedList排序实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#双向链表LinkedList排序实现方法。分享给大家供大家参考。具体如下: 1.函数 打印链表函数PrintLinkedList 和 排序函数SortLinkedList 注:下面代码中的链表每项都是double类型,如果换做其他

  • 我写了下面的代码,但它在执行create()函数后停止工作。我想从头节点开始删除替代元素。我的delete_Alt()函数正确吗?请告诉我哪里错了。

  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 主要内容:双向链表的创建目前我们所学到的 链表,无论是动态链表还是 静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为 单向链表(或 单链表)。 虽然使用单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后"

  • 双向链表 结构体 struct   rt_list_node   双向链表节点 更多...   宏定义 #define  rt_container_of(ptr, type, member)   ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))   获取type结构体中member成员在这个结构体中的偏移   #de

  • 双向链表 Linux 内核自己实现了双向链表,可以在 include/linux/list.h 找到定义。我们将会从双向链表数据结构开始内核的数据结构。为什么?因为它在内核里使用的很广泛,你只需要在 free-electrons.com 检索一下就知道了。 首先让我们看一下在 include/linux/types.h 里的主结构体: struct list_head { struct l