C中没有任何空叶的树

C中没有任何空叶的树,c,data-structures,tree,C,Data Structures,Tree,我需要创建一个BNF树,其中的节点有3个子节点、2个子节点、1个子节点和0子节点,并且ı必须为每个节点创建不同的结构,因为不应该有任何指向null的边,但ı实际上无法理解这个概念,因为ı过去只使用一个结构来完成这项工作,并将未使用的叶子指向空,任何想法、提示、指导都会被告知。一个可能的解决方案可能是使用带有联合的标记结构 差不多 enum NodeType { NODE_LEAF, // A leaf node, no children NODE_1, // One chi

我需要创建一个BNF树,其中的节点有3个子节点、2个子节点、1个子节点和0子节点,并且ı必须为每个节点创建不同的结构,因为不应该有任何指向null的边,但ı实际上无法理解这个概念,因为ı过去只使用一个结构来完成这项工作,并将未使用的叶子指向空,任何想法、提示、指导都会被告知。

一个可能的解决方案可能是使用带有联合的标记结构

差不多

enum NodeType
{
    NODE_LEAF, // A leaf node, no children
    NODE_1,    // One child
    NODE_2,    // Two children
    NODE_3     // Three children
};

struct Node
{
    enum NodeType type;

    union
    {
        struct
        {
            // TODO: Data for leaf nodes
        } leaf;

        struct
        {
            struct Node *child;  // One and only child
        } node_1;

        struct
        {
            struct Node *children[2];  // Two children
        } node_2;

        struct
        {
            struct Node *children[3];  // Three children
        } node_3;
    };
};

然后根据
type
的值,使用
leaf
node_1
node_2
node_3
联合成员。

与另一个答案一样,您需要一个枚举来确定每个节点的类型

enum NodeType
{
    NODE_LEAF, // A leaf node, no children
    NODE_1,    // One child
    NODE_2,    // Two children
    NODE_3     // Three children
};
然后为所有具有公共前缀的节点类型定义结构:

struct NodeLeaf {
    NodeType type;
    ...
};
struct Node1 {
    NodeType type;
    NodeType *child[1];
};
struct Node2 {
    NodeType type;
    NodeType *child[2];
};
struct Node3 {
    NodeType type;
    NodeType *child[3];
};

子指针指向其中一个结构,所有结构都以节点类型开头。方便的是,我已经给了他们
NodeType*
作为类型,而不是
void*
,以使类型更易于阅读。然后,您可以根据*child[n]中的内容将每个子结构强制转换为右侧结构。并将相关结构的子类型转换分配给
NodeType*
或使用
foo.child[0]=&bar.type

这些要求来自哪里?听起来很奇怪。另外,要确保:C是赋值还是C++?i’我想知道是否可以使用继承。这是C赋值,他们说我们可以用void*数据类型来存储子项,但是ıtype如何转换它们并访问它们,这是我心中的一个大问题,我没有遇到过这样的事情,所以我真的很困惑