首先,我们需要修复您的结构声明。这是typedef <type declaration> <name>。所以不是*Sales,而是Sales。
typedef struct sales
{
int* salesN;
int* salesP;
} Sales;
现在我们按照the GTree documentation 中的说明,首先制作一棵树并告诉它如何比较键。
GTree *sales_tree = g_tree_new(g_str_equal);
我们不能使用strcmp,因为它的签名错误。相反,我们使用Hash Tables 中的函数。
现在我们进行销售并使用密钥插入它。这一切都是通过指针、键和值来完成的。
// Make a Sale
int n = 23;
int p = 42;
Sales sale = { .salesN = &n, .salesP = &p };
// Insert it as "The Stuff".
const char *key = "The Stuff";
g_tree_insert(sales_tree, &key, &sale);
我们可以使用相同的键将其作为指针检索。
Sales *found = g_tree_lookup(sales_tree, key);
printf("n %d, p %d\n", *found->salesN, *found->salesP);
最后,清理树以避免内存泄漏。
g_tree_destroy(sales_tree);
g_tree_foreach 的工作方式与q_sort_r 非常相似。它需要一个GTraverseFunc 类型的函数指针,它将在每个节点上调用。如果返回 true,则遍历停止。
g_tree_foreach 接受一个额外的参数,该参数将传递给函数的每次调用。这允许您在遍历期间存储信息,而无需使用全局变量。
例如,这里有一个小函数,它使用GPtrArray 来收集树中所有值的列表。
gboolean find_all_nodes(gpointer key, gpointer value, gpointer all) {
g_ptr_array_add(all, value);
return FALSE;
}
然后我们像这样使用我们的函数遍历树。
GPtrArray *all = g_ptr_array_new();
g_tree_foreach(sales_tree, find_all_nodes, all);
我们可以查看我们在指针数组中捕获的内容,确保在完成后释放它。
for( int i = 0; i < all->len; i++ ) {
Sales *s = g_ptr_array_index(all, i);
printf("n %d, p %d\n", *s->salesN, *s->salesP);
}
g_ptr_array_free(all, TRUE);