在GLib N元树中查找节点

时间:2018-12-16 17:03:49

标签: c tree glib

我正在尝试使用GLib 2.58.1构建节点的N元树,该树表示不同项目之间的依赖关系(父项必须在其子项之前进行处理,但同级项可以按任何顺序进行处理)。我存储在每个节点中的结构(或更准确地说,是指向该结构的指针)是:

struct item
{
  int id;
  // Some other fields
};

每次创建并填充一个新的struct item时,我都想搜索树以查看它是否已经包含一个GNode以及一个指向struct item的指针,该指针具有相同的{{ 1}},如果有,则返回指向该id的指针以便我可以操作它;如果找不到匹配项,则返回GNode,以便可以插入一个新的NULL。对树和搜索的约束是:

  1. 只有GNode字段的相等性与匹配相关。其他字段可以忽略(这就是为什么我没有全部列出它们的原因)。
  2. 任何给定的id永远不会有零个或一个节点,因此一旦找到匹配项或访问了所有节点(以先到者为准),搜索就会停止。
  3. 根据id中的任何信息,树将很小并且不会平衡,因此可以采用任何遍历顺序。

我正在努力找到合适的功能或功能组合来实现此目标,尤其是因为文档基本上是API参考而非教程,并且N进制树似乎不如结构这样频繁使用作为链接列表。

似乎最接近我想要的两个功能是:

struct item:这将数据查找为g_node_find,实际上是指向内存项的指针。但是,我不想比较指针,而是想比较指针所指向的结构中的值(如果可以的话)。

gpointer data:这遍历了整个树,让我指定了一个比较节点的函数,但是返回了g_node_traverse,而我希望它返回了void

是否可以使用GLib的N元树实现方式来实现上述目的,还是应该在寻找替代库?作为最后的选择,我可以滚动自己的N元树结构,但是在这种情况下,这似乎有些过分。

1 个答案:

答案 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