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

Pointers to two different types of nodes

本文关键字:节点 指针 同类型 两种      更新时间:2023-10-16

我在c++中编码一个哈希树,在那里我需要两种不同类型的节点,即一种用于非叶子,将简单地指向它的孩子和其他叶子节点,其中包含所需的信息。

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

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

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

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

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*,你总是可以把它转换回你需要的任何东西。根据您的具体需求:联合将执行得最好,多态性将是最易读的,void*将与联合具有相同的性能,如果您不喜欢联合,则根据您的喜好编写更简洁的代码。