C++ 指向两种不同类型节点的指针

C++ 指向两种不同类型节点的指针,c++,C++,我在C++中编码一个散列树,在这里我需要两种不同类型的节点,即一个用于非叶的节点,它只指向它的子节点,而另一个节点则包含包含所需信息的叶子节点。p> 我面临的问题是如何在非叶节点中声明指针。因为有些非叶节点指向其他非叶节点,有些必须指向叶节点。因此,我不能在非叶节点中为指针声明一种指针类型 如果有任何帮助,我们将不胜感激。我会在标题中使用一个并集和一个标志,告诉我所讨论的指针是指向节点还是叶子 struct Header { int isLeaf; } struct Leaf {

我在C++中编码一个散列树,在这里我需要两种不同类型的节点,即一个用于非叶的节点,它只指向它的子节点,而另一个节点则包含包含所需信息的叶子节点。p> 我面临的问题是如何在非叶节点中声明指针。因为有些非叶节点指向其他非叶节点,有些必须指向叶节点。因此,我不能在非叶节点中为指针声明一种指针类型


如果有任何帮助,我们将不胜感激。

我会在标题中使用一个并集和一个标志,告诉我所讨论的指针是指向节点还是叶子

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;
}

我将使用一个并集和标题中的一个标志来处理这个问题,该标志告诉我所讨论的指针是指向节点还是指向叶

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;
}

有几种解决方案。您可以简单地使非叶从叶继承,并让多态性处理它。或者使用联合和标志来确定使用哪一个。或者说,最肮脏的,但有时是有效的,是一个简单的空虚,你可以随时把它扔回你需要的任何东西。取决于您的具体需求:如果您不喜欢联合,联合将表现得最好,多态性将最具可读性,而void*的性能将与联合相同,这取决于您是否喜欢更干净的代码。

有几种解决方案。您可以简单地使非叶从叶继承,并让多态性处理它。或者使用联合和标志来确定使用哪一个。或者说,最肮脏的,但有时是有效的,是一个简单的空虚,你可以随时把它扔回你需要的任何东西。根据您的具体需要:union将表现最佳,多态性将最具可读性,而void*的性能将与union相同,这取决于您不喜欢union时的代码是否干净。

与其有叶节点和无叶节点,不如有一个带数据指针的节点类。如果节点不是叶节点,则数据指针将为
NULL
。如果节点是叶节点,则
节点*
将为
NULL

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

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

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

你是用C还是C++来编码?@ NPE基本上是C++,但是我在这两个方面都很舒服。你是用C语言还是C++语言?@ NPE基本上是C++,但是我很舒服。那么,节点的结构是什么?你能解释一下吗?上面的编辑帮助吗?还是你还需要更多?
NodeBody
很容易成为指向
Entity
实例的指针,那么节点的结构是什么,您能再解释一下吗?上面的编辑有帮助吗?还是你还需要更多?
NodeBody
可能只是指向
Entity
实例的指针,这是我要提到的唯一一个警告,在一般应用程序中可能不是问题,但在大型树中却是一个非常重要的问题。这种方法需要为表中未使用1/2的每个条目分配两个指针,此外还要分配条目本身。很可能不是问题。。。如果表是巨大的,那么可能会有非常大的内存接收器。关于这一点,我要提出的唯一警告是,这在一般应用程序中可能不是一个问题,但在大型树中却是一个非常重要的问题。这种方法需要为表中未使用1/2的每个条目分配两个指针,此外还要分配条目本身。很可能不是问题。。。如果表很大,则可能是一个非常大的内存接收器。