<!-- ##### SECTION Title ##### -->
Doubly-Linked Lists

<!-- ##### SECTION Short_Description ##### -->
linked lists containing integer values or pointers to data, with the ability
to iterate over the list in both directions.

<!-- ##### SECTION Long_Description ##### -->
<para>
The #GList structure and its associated functions provide a standard
doubly-linked list data structure.
</para>
<para>
Each element in the list contains a piece of data, together with pointers
which link to the previous and next elements in the list.
Using these pointers it is possible to move through the list in both
directions (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 one
of 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 #GAllocator, which is
more efficient than allocating elements individually.
</para>
<para>
Note that most of the #GList functions expect to be passed a pointer to
the first element in the list. The functions which insert elements return
the new start of the list, which may have changed.
</para>
<para>
There is no function to create a #GList. %NULL is considered to be the empty
list so you simply set a #GList* to %NULL.
</para>
<para>
To add elements, use g_list_append(), g_list_prepend(), g_list_insert()
and g_list_insert_sorted().
</para>
<para>
To remove elements, use g_list_remove().
</para>
<para>
To find elements in the list use g_list_first(), g_list_last(), g_list_next(),
g_list_previous(), g_list_nth(), g_list_nth_data(), g_list_find() and
g_list_find_custom().
</para>
<para>
To find the index of an element use g_list_position() and g_list_index().
</para>
<para>
To call a function for each element in the list use g_list_foreach().
</para>
<para>
To free the entire list, use g_list_free().
</para>

<!-- ##### SECTION See_Also ##### -->
<para>

</para>

<!-- ##### SECTION Stability_Level ##### -->


<!-- ##### STRUCT GList ##### -->
<para>
The #GList struct is used for each element in a doubly-linked list.
The <structfield>data</structfield> field holds the element's data, which can
be 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>

@data: 
@next: 
@prev: 

<!-- ##### FUNCTION g_list_append ##### -->
<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, so
make 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>

@list: a pointer to a #GList.
@data: the data for the new element.
@Returns: the new start of the #GList.


<!-- ##### FUNCTION g_list_prepend ##### -->
<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, so
make 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>

@list: a pointer to a #GList.
@data: the data for the new element.
@Returns: the new start of the #GList.


<!-- ##### FUNCTION g_list_insert ##### -->
<para>
Inserts a new element into the list at the given position.
</para>

@list: a pointer to a #GList.
@data: the data for the new element.
@position: the position to insert the element. If this is negative, or is
larger than the number of elements in the list, the new element is added on
to the end of the list.
@Returns: the new start of the #GList.


<!-- ##### FUNCTION g_list_insert_before ##### -->
<para>
Inserts a new element into the list before the given position.
</para>

@list: a pointer to a #GList.
@sibling: the list element before which the new element is inserted
  or %NULL to insert at the end of the list.
@data: the data for the new element.
@Returns: the new start of the #GList.


<!-- ##### FUNCTION g_list_insert_sorted ##### -->
<para>
Inserts a new element into the list, using the given comparison function
to determine its position.
</para>

@list: a pointer to a #GList.
@data: the data for the new element.
@func: the function to compare elements in the list. It should return a
number > 0 if the first parameter comes after the second parameter in
the sort order.
@Returns: the new start of the #GList.


<!-- ##### FUNCTION g_list_remove ##### -->
<para>
Removes an element from a #GList.
If two elements contain the same data, only the first is removed.
If none of the elements contain the data, the #GList is unchanged.
</para>

@list: a #GList.
@data: the data of the element to remove.
@Returns: the new start of the #GList.


<!-- ##### FUNCTION g_list_remove_link ##### -->
<para>
Removes an element from a #GList, without freeing the element.
The removed element's prev and next links are set to %NULL, so that it becomes a
self-contained list with one element.
</para>

@list: a #GList.
@llink: an element in the #GList.
@Returns: the new start of the #GList, without the element.


<!-- ##### FUNCTION g_list_delete_link ##### -->
<para>
Deletes the node @link_ from @list.
</para>

@list: a #GList.
@link_: node to delete from @list.
@Returns: the new head of @list.


<!-- ##### FUNCTION g_list_remove_all ##### -->
<para>
Removes all list nodes with data equal to @data. Returns the new
head of the list. Contrast with g_list_remove() which removes only 
the first node matching the given data.
</para>

@list: a #GList.
@data: data to remove.
@Returns: new head of @list.


<!-- ##### FUNCTION g_list_free ##### -->
<para>
Frees all of the memory used by a #GList.
The freed elements are added to the #GAllocator free list.
</para>
<note>
<para>
If list elements contain dynamically-allocated memory, they should be freed
first.
</para>
</note>

@list: a #GList.


<!-- ##### FUNCTION g_list_alloc ##### -->
<para>
Allocates space for one #GList element.
It is called by g_list_append(), g_list_prepend(), g_list_insert() and
g_list_insert_sorted() and so is rarely used on its own.
</para>

@Returns: a pointer to the newly-allocated #GList element.


<!-- ##### FUNCTION g_list_free_1 ##### -->
<para>
Frees one #GList element.
It is usually used after g_list_remove_link().
</para>

@list: a #GList element.


<!-- ##### FUNCTION g_list_length ##### -->
<para>
Gets the number of elements in a #GList.
</para>

@list: a #GList.
@Returns: the number of elements in the #GList.


<!-- ##### FUNCTION g_list_copy ##### -->
<para>
Copies a #GList.
</para>
<para>
Note that this is a "shallow" copy. If the list elements consist of pointers
to data, the pointers are copied but the actual data isn't.
</para>

@list: a #GList.
@Returns: a copy of @list.


<!-- ##### FUNCTION g_list_reverse ##### -->
<para>
Reverses a #GList.
It simply switches the next and prev pointers of each element.
</para>

@list: a #GList.
@Returns: the start of the reversed #GList.


<!-- ##### FUNCTION g_list_sort ##### -->
<para>
Sorts a #GList using the given comparison function.
</para>

@list: a #GList.
@compare_func: the comparison function used to sort the #GList. This function
is passed 2 elements of the #GList and should return 0 if they are equal,
a negative value if the first element comes before the second, or a positive
value if the first element comes after the second.
@Returns: the start of the sorted #GList.


<!-- ##### USER_FUNCTION GCompareFunc ##### -->
<para>
Specifies the type of a comparison function used to compare two
values.  The function should return a negative integer if the first
value comes before the second, 0 if they are equal, or a positive
integer if the first value comes after the second.
</para>

@a: a value.
@b: a value to compare with.
@Returns: negative value if @a &lt; @b; zero if @a = @b; positive value
if @a > @b.


<!-- ##### FUNCTION g_list_sort_with_data ##### -->
<para>
Like g_list_sort(), but the comparison function accepts a user data argument.
</para>

@list: a #GList.
@compare_func: comparison function.
@user_data: user data to pass to comparison function.
@Returns: the new head of @list.


<!-- ##### USER_FUNCTION GCompareDataFunc ##### -->
<para>
Specifies the type of a comparison function used to compare two
values.  The function should return a negative integer if the first
value comes before the second, 0 if they are equal, or a positive
integer if the first value comes after the second.
</para>

@a: a value.
@b: a value to compare with.
@user_data: user data to pass to comparison function.
@Returns: negative value if @a &lt; @b; zero if @a = @b; positive value
if @a > @b.


<!-- ##### FUNCTION g_list_concat ##### -->
<para>
Adds the second #GList onto the end of the first #GList.
Note that the elements of the second #GList are not copied.
They are used directly.
</para>

@list1: a #GList.
@list2: the #GList to add to the end of the first #GList.
@Returns: the start of the new #GList.


<!-- ##### FUNCTION g_list_foreach ##### -->
<para>
Calls a function for each element of a #GList.
</para>

@list: a #GList.
@func: the function to call with each element's data.
@user_data: user data to pass to the function.


<!-- ##### USER_FUNCTION GFunc ##### -->
<para>
Specifies the type of functions passed to g_list_foreach() and
g_slist_foreach().
</para>

@data: the element's data.
@user_data: user data passed to g_list_foreach() or g_slist_foreach().


<!-- ##### FUNCTION g_list_first ##### -->
<para>
Gets the first element in a #GList.
</para>

@list: a #GList.
@Returns: the first element in a #GList, or %NULL if the #GList has no elements.


<!-- ##### FUNCTION g_list_last ##### -->
<para>
Gets the last element in a #GList.
</para>

@list: a #GList.
@Returns: the last element in the #GList, or %NULL if the #GList has no
elements.


<!-- ##### MACRO g_list_previous ##### -->
<para>
A convenience macro to gets the previous element in a #GList.
</para>

@list: an element in a #GList.
@Returns: the previous element, or %NULL if there are no previous elements.


<!-- ##### MACRO g_list_next ##### -->
<para>
A convenience macro to gets the next element in a #GList.
</para>

@list: an element in a #GList.
@Returns: the next element, or %NULL if there are no more elements.


<!-- ##### FUNCTION g_list_nth ##### -->
<para>
Gets the element at the given position in a #GList.
</para>

@list: a #GList.
@n: the position of the element, counting from 0.
@Returns: the element, or %NULL if the position is off the end of the #GList.


<!-- ##### FUNCTION g_list_nth_data ##### -->
<para>
Gets the data of the element at the given position.
</para>

@list: a #GList.
@n: the position of the element.
@Returns: the element's data, or %NULL if the position is off the end of the
#GList.


<!-- ##### FUNCTION g_list_nth_prev ##### -->
<para>
Gets the element @n places before @list.
</para>

@list: a #GList.
@n: the position of the element, counting from 0.
@Returns: the element, or %NULL if the position is off the end of the #GList.


<!-- ##### FUNCTION g_list_find ##### -->
<para>
Finds the element in a #GList which contains the given data.
</para>

@list: a #GList.
@data: the element data to find.
@Returns: the found #GList element, or %NULL if it is not found.


<!-- ##### FUNCTION g_list_find_custom ##### -->
<para>
Finds an element in a #GList, using a supplied function to find the desired
element.
It iterates over the list, calling the given function which should return 0
when the desired element is found.
The function takes two #gconstpointer arguments, the #GList element's data
and the given user data.
</para>

@list: a #GList.
@data: user data passed to the function.
@func: the function to call for each element. It should return 0 when the
desired element is found.
@Returns: the found #GList element, or %NULL if it is not found.


<!-- ##### FUNCTION g_list_position ##### -->
<para>
Gets the position of the given element in the #GList (starting from 0).
</para>

@list: a #GList.
@llink: an element in the #GList.
@Returns: the position of the element in the #GList, or -1 if the element is
not found.


<!-- ##### FUNCTION g_list_index ##### -->
<para>
Gets the position of the element containing the given data (starting from 0).
</para>

@list: a #GList.
@data: the data to find.
@Returns: the index of the element containing the data, or -1 if the data
is not found.


<!-- ##### FUNCTION g_list_push_allocator ##### -->
<para>
Sets the allocator to use to allocate #GList elements.
Use g_list_pop_allocator() to restore the previous allocator.
</para>
<para>
Note that this function is not available if GLib has been compiled
with <option>--disable-mem-pools</option>
</para>

@allocator: the #GAllocator to use when allocating #GList elements.


<!-- ##### FUNCTION g_list_pop_allocator ##### -->
<para>
Restores the previous #GAllocator, used when allocating #GList elements.
</para>
<para>
Note that this function is not available if GLib has been compiled
with <option>--disable-mem-pools</option>
</para>



