📄 linked_lists_double.sgml
字号:
<refentry id="glib-Doubly-Linked-Lists"><refmeta><refentrytitle>Doubly-Linked Lists</refentrytitle><manvolnum>3</manvolnum><refmiscinfo>GLIB Library</refmiscinfo></refmeta><refnamediv><refname>Doubly-Linked Lists</refname><refpurpose>linked lists containing integer values or pointers to data, with the abilityto iterate over the list in both directions.</refpurpose></refnamediv><refsynopsisdiv><title>Synopsis</title><synopsis>#include <glib.h>struct <link linkend="GList">GList</link>;<link linkend="GList">GList</link>* <link linkend="g-list-append">g_list_append</link> (<link linkend="GList">GList</link> *list, <link linkend="gpointer">gpointer</link> data);<link linkend="GList">GList</link>* <link linkend="g-list-prepend">g_list_prepend</link> (<link linkend="GList">GList</link> *list, <link linkend="gpointer">gpointer</link> data);<link linkend="GList">GList</link>* <link linkend="g-list-insert">g_list_insert</link> (<link linkend="GList">GList</link> *list, <link linkend="gpointer">gpointer</link> data, <link linkend="gint">gint</link> position);<link linkend="GList">GList</link>* <link linkend="g-list-insert-before">g_list_insert_before</link> (<link linkend="GList">GList</link> *list, <link linkend="GList">GList</link> *sibling, <link linkend="gpointer">gpointer</link> data);<link linkend="GList">GList</link>* <link linkend="g-list-insert-sorted">g_list_insert_sorted</link> (<link linkend="GList">GList</link> *list, <link linkend="gpointer">gpointer</link> data, <link linkend="GCompareFunc">GCompareFunc</link> func);<link linkend="GList">GList</link>* <link linkend="g-list-remove">g_list_remove</link> (<link linkend="GList">GList</link> *list, <link linkend="gconstpointer">gconstpointer</link> data);<link linkend="GList">GList</link>* <link linkend="g-list-remove-link">g_list_remove_link</link> (<link linkend="GList">GList</link> *list, <link linkend="GList">GList</link> *llink);<link linkend="GList">GList</link>* <link linkend="g-list-delete-link">g_list_delete_link</link> (<link linkend="GList">GList</link> *list, <link linkend="GList">GList</link> *link);<link linkend="GList">GList</link>* <link linkend="g-list-remove-all">g_list_remove_all</link> (<link linkend="GList">GList</link> *list, <link linkend="gconstpointer">gconstpointer</link> data);void <link linkend="g-list-free">g_list_free</link> (<link linkend="GList">GList</link> *list);<link linkend="GList">GList</link>* <link linkend="g-list-alloc">g_list_alloc</link> (void);void <link linkend="g-list-free-1">g_list_free_1</link> (<link linkend="GList">GList</link> *list);<link linkend="guint">guint</link> <link linkend="g-list-length">g_list_length</link> (<link linkend="GList">GList</link> *list);<link linkend="GList">GList</link>* <link linkend="g-list-copy">g_list_copy</link> (<link linkend="GList">GList</link> *list);<link linkend="GList">GList</link>* <link linkend="g-list-reverse">g_list_reverse</link> (<link linkend="GList">GList</link> *list);<link linkend="GList">GList</link>* <link linkend="g-list-sort">g_list_sort</link> (<link linkend="GList">GList</link> *list, <link linkend="GCompareFunc">GCompareFunc</link> compare_func);<link linkend="gint">gint</link> (<link linkend="GCompareFunc">*GCompareFunc</link>) (<link linkend="gconstpointer">gconstpointer</link> a, <link linkend="gconstpointer">gconstpointer</link> b);<link linkend="GList">GList</link>* <link linkend="g-list-sort-with-data">g_list_sort_with_data</link> (<link linkend="GList">GList</link> *list, <link linkend="GCompareDataFunc">GCompareDataFunc</link> compare_func, <link linkend="gpointer">gpointer</link> user_data);<link linkend="gint">gint</link> (<link linkend="GCompareDataFunc">*GCompareDataFunc</link>) (<link linkend="gconstpointer">gconstpointer</link> a, <link linkend="gconstpointer">gconstpointer</link> b, <link linkend="gpointer">gpointer</link> user_data);<link linkend="GList">GList</link>* <link linkend="g-list-concat">g_list_concat</link> (<link linkend="GList">GList</link> *list1, <link linkend="GList">GList</link> *list2);void <link linkend="g-list-foreach">g_list_foreach</link> (<link linkend="GList">GList</link> *list, <link linkend="GFunc">GFunc</link> func, <link linkend="gpointer">gpointer</link> user_data);void (<link linkend="GFunc">*GFunc</link>) (<link linkend="gpointer">gpointer</link> data, <link linkend="gpointer">gpointer</link> user_data);<link linkend="GList">GList</link>* <link linkend="g-list-first">g_list_first</link> (<link linkend="GList">GList</link> *list);<link linkend="GList">GList</link>* <link linkend="g-list-last">g_list_last</link> (<link linkend="GList">GList</link> *list);#define <link linkend="g-list-previous">g_list_previous</link> (list)#define <link linkend="g-list-next">g_list_next</link> (list)<link linkend="GList">GList</link>* <link linkend="g-list-nth">g_list_nth</link> (<link linkend="GList">GList</link> *list, <link linkend="guint">guint</link> n);<link linkend="gpointer">gpointer</link> <link linkend="g-list-nth-data">g_list_nth_data</link> (<link linkend="GList">GList</link> *list, <link linkend="guint">guint</link> n);<link linkend="GList">GList</link>* <link linkend="g-list-nth-prev">g_list_nth_prev</link> (<link linkend="GList">GList</link> *list, <link linkend="guint">guint</link> n);<link linkend="GList">GList</link>* <link linkend="g-list-find">g_list_find</link> (<link linkend="GList">GList</link> *list, <link linkend="gconstpointer">gconstpointer</link> data);<link linkend="GList">GList</link>* <link linkend="g-list-find-custom">g_list_find_custom</link> (<link linkend="GList">GList</link> *list, <link linkend="gconstpointer">gconstpointer</link> data, <link linkend="GCompareFunc">GCompareFunc</link> func);<link linkend="gint">gint</link> <link linkend="g-list-position">g_list_position</link> (<link linkend="GList">GList</link> *list, <link linkend="GList">GList</link> *llink);<link linkend="gint">gint</link> <link linkend="g-list-index">g_list_index</link> (<link linkend="GList">GList</link> *list, <link linkend="gconstpointer">gconstpointer</link> data);void <link linkend="g-list-push-allocator">g_list_push_allocator</link> (<link linkend="GAllocator">GAllocator</link> *allocator);void <link linkend="g-list-pop-allocator">g_list_pop_allocator</link> (void);</synopsis></refsynopsisdiv><refsect1><title>Description</title><para>The <link linkend="GList">GList</link> structure and its associated functions provide a standarddoubly-linked list data structure.</para><para>Each element in the list contains a piece of data, together with pointerswhich link to the previous and next elements in the list.Using these pointers it is possible to move through the list in bothdirections (unlike the<link linkend="glib-Singly-Linked-lists">Singly-Linked Lists</link>which only allows movement through the list in the forward direction).</para><para>The data contained in each element can be either integer values, by using oneof the<link linkend="glib-Type-Conversion-Macros">Type Conversion Macros</link>,or simply pointers to any type of data.</para><para>List elements are allocated in blocks using a <link linkend="GListAllocator">GListAllocator</link>, which ismore efficient than allocating elements individually.</para><para>Note that most of the <link linkend="GList">GList</link> functions expect to be passed a pointer tothe first element in the list. The functions which insert elements returnthe new start of the list, which may have changed.</para><para>There is no function to create a <link linkend="GList">GList</link>. <literal>NULL</literal> is considered to be the emptylist so you simply set a <link linkend="GList">GList</link>* to <literal>NULL</literal>.</para><para>To add elements, use <link linkend="g-list-append">g_list_append</link>(), <link linkend="g-list-prepend">g_list_prepend</link>(), <link linkend="g-list-insert">g_list_insert</link>()and <link linkend="g-list-insert-sorted">g_list_insert_sorted</link>().</para><para>To remove elements, use <link linkend="g-list-remove">g_list_remove</link>().</para><para>To find elements in the list use <link linkend="g-list-first">g_list_first</link>(), <link linkend="g-list-last">g_list_last</link>(), <link linkend="g-list-next">g_list_next</link>(),<link linkend="g-list-previous">g_list_previous</link>(), <link linkend="g-list-nth">g_list_nth</link>(), <link linkend="g-list-nth-data">g_list_nth_data</link>(), <link linkend="g-list-find">g_list_find</link>() and<link linkend="g-list-find-custom">g_list_find_custom</link>().</para><para>To find the index of an element use <link linkend="g-list-position">g_list_position</link>() and <link linkend="g-list-index">g_list_index</link>().</para><para>To call a function for each element in the list use <link linkend="g-list-foreach">g_list_foreach</link>().</para><para>To free the entire list, use <link linkend="g-list-free">g_list_free</link>().</para></refsect1><refsect1><title>Details</title><refsect2><title><anchor id="GList">struct GList</title><programlisting>struct GList{ gpointer data; GList *next; GList *prev;};</programlisting><para>The <link linkend="GList">GList</link> struct is used for each element in a doubly-linked list.The <structfield>data</structfield> field holds the element's data, which canbe a pointer to any kind of data, or any integer value using the<link linkend="glib-Type-Conversion-Macros">Type Conversion Macros</link>.The <structfield>next</structfield> and <structfield>prev</structfield>pointers are the links to the next and previous elements in the list.</para></refsect2><refsect2><title><anchor id="g-list-append">g_list_append ()</title><programlisting><link linkend="GList">GList</link>* g_list_append (<link linkend="GList">GList</link> *list, <link linkend="gpointer">gpointer</link> data);</programlisting><para>Adds a new element on to the end of the list.</para><note><para>The return value is the new start of the list, which may have changed, somake sure you store the new value.</para></note><informalexample><programlisting> /* Notice that these are initialized to the empty list. */ GList *list = NULL, *number_list = NULL; /* This is a list of strings. */ list = g_list_append (list, "first"); list = g_list_append (list, "second"); /* This is a list of integers. */ number_list = g_list_append (number_list, GINT_TO_POINTER (27)); number_list = g_list_append (number_list, GINT_TO_POINTER (14));</programlisting></informalexample><informaltable pgwide="1" frame="none" role="params"><tgroup cols="2"><colspec colwidth="2*"><colspec colwidth="8*"><tbody><row><entry align="right"><parameter>list</parameter> :</entry><entry>a pointer to a <link linkend="GList">GList</link>.</entry></row><row><entry align="right"><parameter>data</parameter> :</entry><entry>the data for the new element.</entry></row><row><entry align="right"><emphasis>Returns</emphasis> :</entry><entry>the new start of the <link linkend="GList">GList</link>.</entry></row></tbody></tgroup></informaltable></refsect2><refsect2><title><anchor id="g-list-prepend">g_list_prepend ()</title><programlisting><link linkend="GList">GList</link>* g_list_prepend (<link linkend="GList">GList</link> *list, <link linkend="gpointer">gpointer</link> data);</programlisting><para>Adds a new element on to the start of the list.</para><note><para>The return value is the new start of the list, which may have changed, somake sure you store the new value.</para></note><informalexample><programlisting> /* Notice that it is initialized to the empty list. */ GList *list = NULL; list = g_list_prepend (list, "last"); list = g_list_prepend (list, "first");</programlisting></informalexample><informaltable pgwide="1" frame="none" role="params"><tgroup cols="2"><colspec colwidth="2*"><colspec colwidth="8*"><tbody><row><entry align="right"><parameter>list</parameter> :</entry><entry>a pointer to a <link linkend="GList">GList</link>.</entry></row><row><entry align="right"><parameter>data</parameter> :</entry><entry>the data for the new element.</entry></row><row><entry align="right"><emphasis>Returns</emphasis> :</entry><entry>the new start of the <link linkend="GList">GList</link>.</entry></row></tbody></tgroup></informaltable></refsect2><refsect2>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -