C中没有任何空叶的树
我需要创建一个BNF树,其中的节点有3个子节点、2个子节点、1个子节点和0子节点,并且ı必须为每个节点创建不同的结构,因为不应该有任何指向null的边,但ı实际上无法理解这个概念,因为ı过去只使用一个结构来完成这项工作,并将未使用的叶子指向空,任何想法、提示、指导都会被告知。一个可能的解决方案可能是使用带有联合的标记结构 差不多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
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如何转换它们并访问它们,这是我心中的一个大问题,我没有遇到过这样的事情,所以我真的很困惑