我正在尝试使用GLib 2.58.1构建节点的N元树,该树表示不同项目之间的依赖关系(父项必须在其子项之前进行处理,但同级项可以按任何顺序进行处理)。我存储在每个节点中的结构(或更准确地说,是指向该结构的指针)是:
struct item
{
int id;
// Some other fields
};
每次创建并填充一个新的struct item
时,我都想搜索树以查看它是否已经包含一个GNode
以及一个指向struct item
的指针,该指针具有相同的{{ 1}},如果有,则返回指向该id
的指针以便我可以操作它;如果找不到匹配项,则返回GNode
,以便可以插入一个新的NULL
。对树和搜索的约束是:
GNode
字段的相等性与匹配相关。其他字段可以忽略(这就是为什么我没有全部列出它们的原因)。id
永远不会有零个或一个节点,因此一旦找到匹配项或访问了所有节点(以先到者为准),搜索就会停止。id
中的任何信息,树将很小并且不会平衡,因此可以采用任何遍历顺序。我正在努力找到合适的功能或功能组合来实现此目标,尤其是因为文档基本上是API参考而非教程,并且N进制树似乎不如结构这样频繁使用作为链接列表。
似乎最接近我想要的两个功能是:
struct item
:这将数据查找为g_node_find
,实际上是指向内存项的指针。但是,我不想比较指针,而是想比较指针所指向的结构中的值(如果可以的话)。
gpointer data
:这遍历了整个树,让我指定了一个比较节点的函数,但是返回了g_node_traverse
,而我希望它返回了void
。
是否可以使用GLib的N元树实现方式来实现上述目的,还是应该在寻找替代库?作为最后的选择,我可以滚动自己的N元树结构,但是在这种情况下,这似乎有些过分。
答案 0 :(得分:1)
您可以使用gpointer data
的{{1}}参数从g_node_traverse
函数返回数据。只需将GNodeTraverseFunc
设置为找到的data
并返回GNode *
。
下面是一个类似的示例,其中在TRUE
中返回了gchar *
字符串:
data
https://sources.debian.org/src/glib2.0/2.58.1-2/tests/testglib.c/?hl=321#L321