📄 trees-nary.sgml
字号:
<refentry id="glib-N-ary-Trees"><refmeta><refentrytitle>N-ary Trees</refentrytitle><manvolnum>3</manvolnum><refmiscinfo>GLIB Library</refmiscinfo></refmeta><refnamediv><refname>N-ary Trees</refname><refpurpose>trees of data with any number of branches.</refpurpose></refnamediv><refsynopsisdiv><title>Synopsis</title><synopsis>#include <glib.h>struct <link linkend="GNode">GNode</link>;<link linkend="GNode">GNode</link>* <link linkend="g-node-new">g_node_new</link> (<link linkend="gpointer">gpointer</link> data);<link linkend="GNode">GNode</link>* <link linkend="g-node-copy">g_node_copy</link> (<link linkend="GNode">GNode</link> *node);<link linkend="GNode">GNode</link>* <link linkend="g-node-insert">g_node_insert</link> (<link linkend="GNode">GNode</link> *parent, <link linkend="gint">gint</link> position, <link linkend="GNode">GNode</link> *node);<link linkend="GNode">GNode</link>* <link linkend="g-node-insert-before">g_node_insert_before</link> (<link linkend="GNode">GNode</link> *parent, <link linkend="GNode">GNode</link> *sibling, <link linkend="GNode">GNode</link> *node);<link linkend="GNode">GNode</link>* <link linkend="g-node-insert-after">g_node_insert_after</link> (<link linkend="GNode">GNode</link> *parent, <link linkend="GNode">GNode</link> *sibling, <link linkend="GNode">GNode</link> *node);#define <link linkend="g-node-append">g_node_append</link> (parent, node)<link linkend="GNode">GNode</link>* <link linkend="g-node-prepend">g_node_prepend</link> (<link linkend="GNode">GNode</link> *parent, <link linkend="GNode">GNode</link> *node);#define <link linkend="g-node-insert-data">g_node_insert_data</link> (parent, position, data)#define <link linkend="g-node-insert-data-before">g_node_insert_data_before</link> (parent, sibling, data)#define <link linkend="g-node-append-data">g_node_append_data</link> (parent, data)#define <link linkend="g-node-prepend-data">g_node_prepend_data</link> (parent, data)void <link linkend="g-node-reverse-children">g_node_reverse_children</link> (<link linkend="GNode">GNode</link> *node);void <link linkend="g-node-traverse">g_node_traverse</link> (<link linkend="GNode">GNode</link> *root, <link linkend="GTraverseType">GTraverseType</link> order, <link linkend="GTraverseFlags">GTraverseFlags</link> flags, <link linkend="gint">gint</link> max_depth, <link linkend="GNodeTraverseFunc">GNodeTraverseFunc</link> func, <link linkend="gpointer">gpointer</link> data);enum <link linkend="GTraverseFlags">GTraverseFlags</link>;<link linkend="gboolean">gboolean</link> (<link linkend="GNodeTraverseFunc">*GNodeTraverseFunc</link>) (<link linkend="GNode">GNode</link> *node, <link linkend="gpointer">gpointer</link> data);void <link linkend="g-node-children-foreach">g_node_children_foreach</link> (<link linkend="GNode">GNode</link> *node, <link linkend="GTraverseFlags">GTraverseFlags</link> flags, <link linkend="GNodeForeachFunc">GNodeForeachFunc</link> func, <link linkend="gpointer">gpointer</link> data);void (<link linkend="GNodeForeachFunc">*GNodeForeachFunc</link>) (<link linkend="GNode">GNode</link> *node, <link linkend="gpointer">gpointer</link> data);<link linkend="GNode">GNode</link>* <link linkend="g-node-get-root">g_node_get_root</link> (<link linkend="GNode">GNode</link> *node);<link linkend="GNode">GNode</link>* <link linkend="g-node-find">g_node_find</link> (<link linkend="GNode">GNode</link> *root, <link linkend="GTraverseType">GTraverseType</link> order, <link linkend="GTraverseFlags">GTraverseFlags</link> flags, <link linkend="gpointer">gpointer</link> data);<link linkend="GNode">GNode</link>* <link linkend="g-node-find-child">g_node_find_child</link> (<link linkend="GNode">GNode</link> *node, <link linkend="GTraverseFlags">GTraverseFlags</link> flags, <link linkend="gpointer">gpointer</link> data);<link linkend="gint">gint</link> <link linkend="g-node-child-index">g_node_child_index</link> (<link linkend="GNode">GNode</link> *node, <link linkend="gpointer">gpointer</link> data);<link linkend="gint">gint</link> <link linkend="g-node-child-position">g_node_child_position</link> (<link linkend="GNode">GNode</link> *node, <link linkend="GNode">GNode</link> *child);#define <link linkend="g-node-first-child">g_node_first_child</link> (node)<link linkend="GNode">GNode</link>* <link linkend="g-node-last-child">g_node_last_child</link> (<link linkend="GNode">GNode</link> *node);<link linkend="GNode">GNode</link>* <link linkend="g-node-nth-child">g_node_nth_child</link> (<link linkend="GNode">GNode</link> *node, <link linkend="guint">guint</link> n);<link linkend="GNode">GNode</link>* <link linkend="g-node-first-sibling">g_node_first_sibling</link> (<link linkend="GNode">GNode</link> *node);#define <link linkend="g-node-next-sibling">g_node_next_sibling</link> (node)#define <link linkend="g-node-prev-sibling">g_node_prev_sibling</link> (node)<link linkend="GNode">GNode</link>* <link linkend="g-node-last-sibling">g_node_last_sibling</link> (<link linkend="GNode">GNode</link> *node);#define <link linkend="G-NODE-IS-LEAF-CAPS">G_NODE_IS_LEAF</link> (node)#define <link linkend="G-NODE-IS-ROOT-CAPS">G_NODE_IS_ROOT</link> (node)<link linkend="guint">guint</link> <link linkend="g-node-depth">g_node_depth</link> (<link linkend="GNode">GNode</link> *node);<link linkend="guint">guint</link> <link linkend="g-node-n-nodes">g_node_n_nodes</link> (<link linkend="GNode">GNode</link> *root, <link linkend="GTraverseFlags">GTraverseFlags</link> flags);<link linkend="guint">guint</link> <link linkend="g-node-n-children">g_node_n_children</link> (<link linkend="GNode">GNode</link> *node);<link linkend="gboolean">gboolean</link> <link linkend="g-node-is-ancestor">g_node_is_ancestor</link> (<link linkend="GNode">GNode</link> *node, <link linkend="GNode">GNode</link> *descendant);<link linkend="guint">guint</link> <link linkend="g-node-max-height">g_node_max_height</link> (<link linkend="GNode">GNode</link> *root);void <link linkend="g-node-unlink">g_node_unlink</link> (<link linkend="GNode">GNode</link> *node);void <link linkend="g-node-destroy">g_node_destroy</link> (<link linkend="GNode">GNode</link> *root);void <link linkend="g-node-push-allocator">g_node_push_allocator</link> (<link linkend="GAllocator">GAllocator</link> *allocator);void <link linkend="g-node-pop-allocator">g_node_pop_allocator</link> (void);</synopsis></refsynopsisdiv><refsect1><title>Description</title><para>The <link linkend="GNode">GNode</link> struct and its associated functions provide a N-ary tree datastructure, where nodes in the tree can contain arbitrary data.</para><para>To create a new tree use <link linkend="g-node-new">g_node_new</link>().</para><para>To insert a node into a tree use <link linkend="g-node-insert">g_node_insert</link>(), <link linkend="g-node-insert-before">g_node_insert_before</link>(),<link linkend="g-node-append">g_node_append</link>() and <link linkend="g-node-prepend">g_node_prepend</link>().</para><para>To create a new node and insert it into a tree use <link linkend="g-node-insert-data">g_node_insert_data</link>(), <link linkend="g-node-insert-data-before">g_node_insert_data_before</link>(), <link linkend="g-node-append-data">g_node_append_data</link>() and <link linkend="g-node-prepend-data">g_node_prepend_data</link>().</para><para>To reverse the children of a node use <link linkend="g-node-reverse-children">g_node_reverse_children</link>().</para><para>To find a node use <link linkend="g-node-get-root">g_node_get_root</link>(), <link linkend="g-node-find">g_node_find</link>(), <link linkend="g-node-find-child">g_node_find_child</link>(),<link linkend="g-node-child-index">g_node_child_index</link>(), <link linkend="g-node-child-position">g_node_child_position</link>(), <link linkend="g-node-first-child">g_node_first_child</link>(), <link linkend="g-node-last-child">g_node_last_child</link>(),<link linkend="g-node-nth-child">g_node_nth_child</link>(), <link linkend="g-node-first-sibling">g_node_first_sibling</link>(), <link linkend="g-node-prev-sibling">g_node_prev_sibling</link>(),<link linkend="g-node-next-sibling">g_node_next_sibling</link>() or <link linkend="g-node-last-sibling">g_node_last_sibling</link>().</para><para>To get information about a node or tree use <link linkend="G-NODE-IS-LEAF-CAPS">G_NODE_IS_LEAF</link>(),<link linkend="G-NODE-IS-ROOT-CAPS">G_NODE_IS_ROOT</link>(), <link linkend="g-node-depth">g_node_depth</link>(), <link linkend="g-node-n-nodes">g_node_n_nodes</link>(), <link linkend="g-node-n-children">g_node_n_children</link>(),<link linkend="g-node-is-ancestor">g_node_is_ancestor</link>() or <link linkend="g-node-max-height">g_node_max_height</link>().</para><para>To traverse a tree, calling a function for each node visited in thetraversal, use <link linkend="g-node-traverse">g_node_traverse</link>() or <link linkend="g-node-children-foreach">g_node_children_foreach</link>().</para><para>To remove a node or subtree from a tree use <link linkend="g-node-unlink">g_node_unlink</link>() or<link linkend="g-node-destroy">g_node_destroy</link>().</para></refsect1><refsect1><title>Details</title><refsect2><title><anchor id="GNode">struct GNode</title><programlisting>struct GNode{ gpointer data; GNode *next; GNode *prev; GNode *parent; GNode *children;};</programlisting><para>The <structname>GNode</structname> struct represents one node in a<link linkend="glib-N-ary-Trees">N-ary Tree</link>.The <structfield>data</structfield> field contains the actual data of the node.The <structfield>next</structfield> and <structfield>prev</structfield>fields point to the node's siblings (a sibling is another <structname>GNode</structname> with thesame parent).The <structfield>parent</structfield> field points to the parent of the <structname>GNode</structname>,or is <literal>NULL</literal> if the <structname>GNode</structname> is the root of the tree.The <structfield>children</structfield> field points to the first child of the<structname>GNode</structname>. The other children are accessed by using the<structfield>next</structfield> pointer of each child.</para></refsect2><refsect2><title><anchor id="g-node-new">g_node_new ()</title><programlisting><link linkend="GNode">GNode</link>* g_node_new (<link linkend="gpointer">gpointer</link> data);</programlisting><para>Creates a new <link linkend="GNode">GNode</link> containing the given data.Used to create the first node in a tree.</para><informaltable pgwide="1" frame="none" role="params"><tgroup cols="2"><colspec colwidth="2*"><colspec colwidth="8*"><tbody><row><entry align="right"><parameter>data</parameter> :</entry><entry>the data of the new node.</entry></row><row><entry align="right"><emphasis>Returns</emphasis> :</entry><entry>a new <link linkend="GNode">GNode</link>.</entry></row></tbody></tgroup></informaltable></refsect2><refsect2><title><anchor id="g-node-copy">g_node_copy ()</title><programlisting><link linkend="GNode">GNode</link>* g_node_copy (<link linkend="GNode">GNode</link> *node);</programlisting><para>Recursively copies a <link linkend="GNode">GNode</link> (but does not deep-copy the data inside the nodes,since there's no way for GLib to know how to do that).</para><informaltable pgwide="1" frame="none" role="params"><tgroup cols="2"><colspec colwidth="2*"><colspec colwidth="8*"><tbody><row><entry align="right"><parameter>node</parameter> :</entry><entry>a <link linkend="GNode">GNode</link>.</entry></row><row><entry align="right"><emphasis>Returns</emphasis> :</entry><entry>a new <link linkend="GNode">GNode</link> containing the same data pointers.</entry></row></tbody></tgroup></informaltable></refsect2><refsect2><title><anchor id="g-node-insert">g_node_insert ()</title><programlisting><link linkend="GNode">GNode</link>* g_node_insert (<link linkend="GNode">GNode</link> *parent, <link linkend="gint">gint</link> position, <link linkend="GNode">GNode</link> *node);</programlisting><para>Inserts a <link linkend="GNode">GNode</link> beneath the parent at the given position.</para><informaltable pgwide="1" frame="none" role="params"><tgroup cols="2"><colspec colwidth="2*"><colspec colwidth="8*"><tbody><row><entry align="right"><parameter>parent</parameter> :</entry><entry>the <link linkend="GNode">GNode</link> to place <parameter>node</parameter> under.</entry></row><row><entry align="right"><parameter>position</parameter> :</entry><entry>the position to place <parameter>node</parameter> at, with respect to its siblings.If position is -1, <parameter>node</parameter> is inserted as the last child of <parameter>parent</parameter>.</entry></row><row><entry align="right"><parameter>node</parameter> :</entry><entry>the <link linkend="GNode">GNode</link> to insert.</entry></row><row><entry align="right"><emphasis>Returns</emphasis> :</entry><entry>the inserted <link linkend="GNode">GNode</link>.</entry></row></tbody></tgroup></informaltable></refsect2><refsect2><title><anchor id="g-node-insert-before">g_node_insert_before ()</title><programlisting><link linkend="GNode">GNode</link>* g_node_insert_before (<link linkend="GNode">GNode</link> *parent, <link linkend="GNode">GNode</link> *sibling, <link linkend="GNode">GNode</link> *node);</programlisting><para>Inserts a <link linkend="GNode">GNode</link> beneath the parent before the given sibling.</para><informaltable pgwide="1" frame="none" role="params"><tgroup cols="2"><colspec colwidth="2*"><colspec colwidth="8*"><tbody><row><entry align="right"><parameter>parent</parameter> :</entry><entry>the <link linkend="GNode">GNode</link> to place <parameter>node</parameter> under.</entry></row><row><entry align="right"><parameter>sibling</parameter> :</entry><entry>the sibling <link linkend="GNode">GNode</link> to place <parameter>node</parameter> before. If sibling is <literal>NULL</literal>,the node is inserted as the last child of <parameter>parent</parameter>.</entry></row><row><entry align="right"><parameter>node</parameter> :</entry><entry>the <link linkend="GNode">GNode</link> to insert.</entry></row><row><entry align="right"><emphasis>Returns</emphasis> :</entry><entry>the inserted <link linkend="GNode">GNode</link>.</entry></row></tbody></tgroup></informaltable></refsect2><refsect2><title><anchor id="g-node-insert-after">g_node_insert_after ()</title><programlisting><link linkend="GNode">GNode</link>* g_node_insert_after (<link linkend="GNode">GNode</link> *parent, <link linkend="GNode">GNode</link> *sibling, <link linkend="GNode">GNode</link> *node);</programlisting><para>Inserts a <link linkend="GNode">GNode</link> beneath the parent after the given sibling.</para><informaltable pgwide="1" frame="none" role="params">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -