我希望实现一个多级数据结构,如下所示。
object {
object A {
child {
myChild;
};
child 1 {
mychild;
};
};
object B {
child {
};
};
};
我的方法是使用链接列表实现此目的,如下所示。
typedef struct node_s {
struct node_s *next;
struct node_s *first_child;
struct node_s *parent;
char *text;
} node_t;
将上面的列表转换为STAILQ(sys / queue.h linux)将是
typedef struct node_s {
char *text;
....;
} node_t;
typedef struct list_s {
STAILQ_ENTRY(list_s) link;
node_t *first_child;
node_t *parent;
node_t *next;
int level;
} list_t;
typedef STAILQ_HEAD(list_head_s, list_s) list_head_t;
请建议除了链接列表或链接列表之外是否还有其他更好的方法来实现此功能?
答案 0 :(得分:2)
您所表示的结构更多的是树而不是链表 - 它是节点的集合,其中每个节点可能有零个或多个子节点,除根之外的每个节点都只有一个父节点。
您正在使用的表示方案通常称为树的left-child, right-sibling表示。它不是让每个节点存储其子节点的显式列表,而是存储指向其子节点的指针,然后通过链表将子节点链接在一起。正如链接问题和答案中所提到的,当内存稀缺时,这有一些优势,但它会增加搜索给定节点的特定子节点所需的时间。
您可以通过许多其他方式来表示此结构,并且您确实可以确定如何执行此操作。一种选择是将子项存储在由子名称键控的某种关联数组结构中(例如,哈希表或平衡二叉搜索树)。这样可以更快地找到给定名称的特定子项,尽管它确实会增加内存使用量。另一种选择是使用所有子节点的显式数组,而不是通过每个节点的子节点线程化链接列表,这需要更多的分配,但是更容易将子节点附加到给定节点。
希望这有帮助!