📄 gnode.c
字号:
child = current->next; if (g_node_depth_traverse_pre_order (current, flags, depth, func, data)) return TRUE; } } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE;}static gbooleang_node_traverse_post_order (GNode *node, GTraverseFlags flags, GNodeTraverseFunc func, gpointer data){ if (node->children) { GNode *child; child = node->children; while (child) { register GNode *current; current = child; child = current->next; if (g_node_traverse_post_order (current, flags, func, data)) return TRUE; } if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE;}static gbooleang_node_depth_traverse_post_order (GNode *node, GTraverseFlags flags, guint depth, GNodeTraverseFunc func, gpointer data){ if (node->children) { depth--; if (depth) { GNode *child; child = node->children; while (child) { register GNode *current; current = child; child = current->next; if (g_node_depth_traverse_post_order (current, flags, depth, func, data)) return TRUE; } } if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE;}static gbooleang_node_traverse_in_order (GNode *node, GTraverseFlags flags, GNodeTraverseFunc func, gpointer data){ if (node->children) { GNode *child; register GNode *current; child = node->children; current = child; child = current->next; if (g_node_traverse_in_order (current, flags, func, data)) return TRUE; if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; while (child) { current = child; child = current->next; if (g_node_traverse_in_order (current, flags, func, data)) return TRUE; } } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE;}static gbooleang_node_depth_traverse_in_order (GNode *node, GTraverseFlags flags, guint depth, GNodeTraverseFunc func, gpointer data){ if (node->children) { depth--; if (depth) { GNode *child; register GNode *current; child = node->children; current = child; child = current->next; if (g_node_depth_traverse_in_order (current, flags, depth, func, data)) return TRUE; if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; while (child) { current = child; child = current->next; if (g_node_depth_traverse_in_order (current, flags, depth, func, data)) return TRUE; } } else if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE;}static gbooleang_node_traverse_level (GNode *node, GTraverseFlags flags, guint level, GNodeTraverseFunc func, gpointer data, gboolean *more_levels){ if (level == 0) { if (node->children) { *more_levels = TRUE; return (flags & G_TRAVERSE_NON_LEAFS) && func (node, data); } else { return (flags & G_TRAVERSE_LEAFS) && func (node, data); } } else { node = node->children; while (node) { if (g_node_traverse_level (node, flags, level - 1, func, data, more_levels)) return TRUE; node = node->next; } } return FALSE;}static gbooleang_node_depth_traverse_level (GNode *node, GTraverseFlags flags, guint depth, GNodeTraverseFunc func, gpointer data){ gint level; gboolean more_levels; level = 0; while (level != depth) { more_levels = FALSE; if (g_node_traverse_level (node, flags, level, func, data, &more_levels)) return TRUE; if (!more_levels) break; level++; } return FALSE;}voidg_node_traverse (GNode *root, GTraverseType order, GTraverseFlags flags, gint depth, GNodeTraverseFunc func, gpointer data){ g_return_if_fail (root != NULL); g_return_if_fail (func != NULL); g_return_if_fail (order <= G_LEVEL_ORDER); g_return_if_fail (flags <= G_TRAVERSE_MASK); g_return_if_fail (depth == -1 || depth > 0); switch (order) { case G_PRE_ORDER: if (depth < 0) g_node_traverse_pre_order (root, flags, func, data); else g_node_depth_traverse_pre_order (root, flags, depth, func, data); break; case G_POST_ORDER: if (depth < 0) g_node_traverse_post_order (root, flags, func, data); else g_node_depth_traverse_post_order (root, flags, depth, func, data); break; case G_IN_ORDER: if (depth < 0) g_node_traverse_in_order (root, flags, func, data); else g_node_depth_traverse_in_order (root, flags, depth, func, data); break; case G_LEVEL_ORDER: g_node_depth_traverse_level (root, flags, depth, func, data); break; }}static gbooleang_node_find_func (GNode *node, gpointer data){ register gpointer *d = data; if (*d != node->data) return FALSE; *(++d) = node; return TRUE;}GNode*g_node_find (GNode *root, GTraverseType order, GTraverseFlags flags, gpointer data){ gpointer d[2]; g_return_val_if_fail (root != NULL, NULL); g_return_val_if_fail (order <= G_LEVEL_ORDER, NULL); g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL); d[0] = data; d[1] = NULL; g_node_traverse (root, order, flags, -1, g_node_find_func, d); return d[1];}static voidg_node_count_func (GNode *node, GTraverseFlags flags, guint *n){ if (node->children) { GNode *child; if (flags & G_TRAVERSE_NON_LEAFS) (*n)++; child = node->children; while (child) { g_node_count_func (child, flags, n); child = child->next; } } else if (flags & G_TRAVERSE_LEAFS) (*n)++;}guintg_node_n_nodes (GNode *root, GTraverseFlags flags){ guint n = 0; g_return_val_if_fail (root != NULL, 0); g_return_val_if_fail (flags <= G_TRAVERSE_MASK, 0); g_node_count_func (root, flags, &n); return n;}GNode*g_node_last_child (GNode *node){ g_return_val_if_fail (node != NULL, NULL); node = node->children; if (node) while (node->next) node = node->next; return node;}GNode*g_node_nth_child (GNode *node, guint n){ g_return_val_if_fail (node != NULL, NULL); node = node->children; if (node) while ((n-- > 0) && node) node = node->next; return node;}guintg_node_n_children (GNode *node){ guint n = 0; g_return_val_if_fail (node != NULL, 0); node = node->children; while (node) { n++; node = node->next; } return n;}GNode*g_node_find_child (GNode *node, GTraverseFlags flags, gpointer data){ g_return_val_if_fail (node != NULL, NULL); g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL); node = node->children; while (node) { if (node->data == data) { if (G_NODE_IS_LEAF (node)) { if (flags & G_TRAVERSE_LEAFS) return node; } else { if (flags & G_TRAVERSE_NON_LEAFS) return node; } } node = node->next; } return NULL;}gintg_node_child_position (GNode *node, GNode *child){ register guint n = 0; g_return_val_if_fail (node != NULL, -1); g_return_val_if_fail (child != NULL, -1); g_return_val_if_fail (child->parent == node, -1); node = node->children; while (node) { if (node == child) return n; n++; node = node->next; } return -1;}gintg_node_child_index (GNode *node, gpointer data){ register guint n = 0; g_return_val_if_fail (node != NULL, -1); node = node->children; while (node) { if (node->data == data) return n; n++; node = node->next; } return -1;}GNode*g_node_first_sibling (GNode *node){ g_return_val_if_fail (node != NULL, NULL); if (node->parent) return node->parent->children; while (node->prev) node = node->prev; return node;}GNode*g_node_last_sibling (GNode *node){ g_return_val_if_fail (node != NULL, NULL); while (node->next) node = node->next; return node;}voidg_node_children_foreach (GNode *node, GTraverseFlags flags, GNodeForeachFunc func, gpointer data){ g_return_if_fail (node != NULL); g_return_if_fail (flags <= G_TRAVERSE_MASK); g_return_if_fail (func != NULL); node = node->children; while (node) { register GNode *current; current = node; node = current->next; if (G_NODE_IS_LEAF (current)) { if (flags & G_TRAVERSE_LEAFS) func (current, data); } else { if (flags & G_TRAVERSE_NON_LEAFS) func (current, data); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -