【发布时间】: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::list或std::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++