【问题标题】:Nested linked list in C++C++中的嵌套链表
【发布时间】:2021-04-21 22:59:13
【问题描述】:

我正在尝试在 C++ 中构建一个嵌套链表(对 C++ 来说非常新)。 列表中的节点可以是一个整数值,也可以是另一个包含所有整数值的链表。

我已经浏览了关于 SO 的其他帖子,并且我知道我应该为节点数据类型使用多种数据类型的联合。 这是我迄今为止所拥有的。

class linkedList {
private:
    struct node {
        union data {
            int val;
            linkedList* list;
        };
        data currData;           
        node* next;             // a pointer which will point to the next node
    }*p;

我的问题是如何开始在节点结构中分配列表指针。 对于val,我知道我可以做p->currData->val =5,例如。

【问题讨论】:

  • 不要使用联合,而是查看std::variant。它的好处是“知道”它包含什么类型的数据。
  • 例如:struct node { std::variant<int, linkedList> currData; node* next; } *p; 当您使用它时,请考虑将您的手动链表替换为标准的std::liststd::forward_list 类,例如:class linkedList { private: std::list<std::variant<int, linkedList>> p; ... };
  • 请记住,当您玩完所有节点时,有人需要收起所有节点,否则您会出现内存泄漏。这本身就是使用std::list 的一个很好的理由。如果你不这样做,你需要弄清楚你是使用int 还是指针,这样你就可以收起所有链接的节点,这就是std::variant 真正有用的地方。如果您仍然选择单独行动,请确保 linkedList 至少观察到 the Rule of Three
  • 旁注:考虑直接存储linkedList 而不是指针。一个正确编写的单链表不应该比一个指针大很多,最坏的情况可能是两个指针(头和尾)和列表中的链接数,并且比指针更容易清理。 .
  • 我不使用 std::list 或 std::variant 的原因纯粹是出于学习指针和内存分配/释放的目的。 @user4581301 您能否澄清一下直接存储链表而不是指针是什么意思?

标签: c++


【解决方案1】:

我不会使用工会。我会为每个字段和 typefield 保留一个值,这样你就知道它是什么了。

 class LinkedList {
 public:
     class Node {
          LinkedList * list = nulptr;
          int value = 0;
          Node * next = nullptr;
     };
 };

在这种情况下,如果 list 为 nullptr,则它不是指向新列表的节点。或者您可以显式添加type,但对于这么简单的事情,我可能不会。

 p->value = 5;

【讨论】:

  • 如何初始化列表指针?我的意思是,这将如何编译?因为 Node 类在编译的时候还不知道 LinkedList 类。我说的对吗?
  • 这是一个内部类。它绝对知道 LinkedList * 是什么。你试过代码了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2020-12-28
  • 1970-01-01
相关资源
最近更新 更多