【问题标题】:Pointers to two different types of nodes指向两种不同类型节点的指针
【发布时间】:2013-04-05 10:00:38
【问题描述】:

我正在用 C++ 编写哈希树,其中我需要两种不同类型的节点,即一种用于非叶节点,它将简单地指向其子节点,另一种用于包含所需信息的叶节点。

我面临的问题是如何在非叶节点中声明指针。因为有些非叶子节点要指向其他非叶子节点,有些必须指向叶子节点。所以我不能为非叶节点中的指针声明一种指针类型。

任何帮助将不胜感激。

【问题讨论】:

  • 你是用 C 还是 C++ 编码?
  • @NPE 基本上在 c++ 中,但我对两者都很满意。

标签: c++


【解决方案1】:

您可以只拥有一个带有数据指针的节点类,而不是拥有一个叶节点和一个非叶节点。如果节点不是叶节点,则数据指针将为NULL。如果节点是叶节点,则Node* 将是NULL

struct Node
{
    Node *child; // NULL if leaf node
    Data *data;  // NULL if not leaf node
};

【讨论】:

  • 对此我要提到的唯一警告,这在一般应用程序中可能不是问题,但在大树中是一个不平凡的问题。除了分配条目本身之外,这种方法还需要为表中未使用 1/2 的每个条目分配两个指针。很可能不是问题...如果表很大,则可能是一个非常大的内存接收器。
【解决方案2】:

我会在标题中使用联合和标志来处理这个问题,告诉我所讨论的指针是指向节点还是叶。

struct Header
{
   int isLeaf;
}

struct Leaf
{
    struct Header header;
    struct LeafBody body;
}

struct Node
{
    struct Header header;
    struct NodeBody body;
}

union Entity
{
    struct Header header;
    struct Node   node;
    struct Leaf   leaf;
}

【讨论】:

  • 那么节点的结构是什么,你能解释一下吗?
  • 以上编辑有帮助吗?还是您需要更多? NodeBody 很容易只是一个指向 Entity 实例的指针
【解决方案3】:

对此有多种解决方案。您可以简单地从叶子继承非叶子,并让多态性处理它。或者使用联合和标志来确定使用哪个。或者最肮脏但有时有效的是一个简单的 void*,您可以随时将其放回您需要的任何东西。取决于您的特定需求:联合将表现最佳,多态性将最易读,并且 void* 将与联合具有相同的性能,并且如果您不喜欢联合,则取决于口味更清晰的代码。

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 2021-02-19
    • 2012-10-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2019-04-19
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多