【问题标题】:C++ constructor and destructor to set a doubly linked listC++构造函数和析构函数设置双向链表
【发布时间】:2021-07-20 15:44:21
【问题描述】:

问题是使用构造函数来设置一个节点, 并使用析构函数确保 prev 和 next 正确连接。

  class ListNode {
    public:
        int data;
        ListNode *prev, *next;
        ListNode(int Data, ListNode* Prev, ListNode *Next);
        ~ListNode();
    };

这是我的代码

class ListNode {
public:
        int data;
        ListNode *prev, *next;
        ListNode(int Data, ListNode *Prev, ListNode *Next) {
            data = Data;
            prev = Prev;
            next = Next;
        }
        ~ListNode() {
            prev -> next = next;
            next -> prev = prev;
        }
};

我遇到了运行时错误。如何解决这个问题。 谢谢

【问题讨论】:

  • 你遇到了什么错误?
  • @d901203 析构函数可能是默认的,因为没有什么要显式删除。
  • 你能依赖prevnext总是指向一个有效的对象,尤其是总是!= nullptr吗?
  • 我应该如何修改我的代码?
  • 不确定它是否能解决您的问题(因为您没有发布运行时错误或任何重现错误的代码),但 if (prev) { prev->next = next; }if(next) {next->prev = prev;} 可以提供帮助

标签: c++ class constructor destructor doubly-linked-list


【解决方案1】:

当前节点的析构函数不能触及其他节点的数据成员。并且类中没有要明确删除的内容。因此,析构函数应隐式或显式默认,例如

~ListNode() = default;

它是整个列表的析构函数(或例如ListNode 类的单独静态函数)会费心正确地删除列表中的所有节点。

例如,您可以声明一个类似的列表

class List
{
private:
    ListNode
    {
        //...
    } *head = nullptr, *tail = nullptr;
    size_t size = 0;

public:
    ~List()
    {
        // delete all nodes in the list
    }
    //...
};

构造函数可以这样定义

    explicit ListNode( int data, ListNode *prev = nullptr, ListNode *next = nullptr)
        : data( data ), prev( prev ), next( next ) 
    {
    }

【讨论】:

    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 2011-04-03
    • 2010-12-16
    • 2019-05-14
    • 1970-01-01
    • 2012-04-10
    • 2012-11-14
    • 2016-09-09
    相关资源
    最近更新 更多