|
La lista enlazada es un TDA que nos
permite almacenar datos de una forma organizada, al igual
que los vectores pero, a diferencia de estos, esta
estructura es dinámica, por lo que no tenemos que saber "a
priori" los elementos que puede contener.
En una lista enlazada, cada elemento apunta al siguiente
excepto el último que no tiene sucesor y el valor del enlace
es null. Por ello los elementos son registros
que contienen el dato a almacenar y un enlace al siguiente
elemento. Los elementos de una lista, suelen recibir también
el nombre de nodos de la lista.
struct lista { gint dato; lista *siguiente; };
GSList
La definición de la estructura
GSList o, lo que es lo mismo, un
nodo de la lista, está definido de la siguiente manera:
struct GSList { gpointer data; GSList *next; };
|
Representa el dato a almacenar. Se utiliza un puntero
genérico por lo que puede almacenar un puntero a
cualquier tipo de dato o bien almacenar un entero
utilizando las macros de conversión de tipos.
|
|
Se trata de un puntero al siguiente elemento de la lista.
|
Las macros de conversión disponibles son las siguientes:
-
GINT_TO_POINTER ()
-
GPOINTER_TO_INT ()
-
GUINT_TO_POINTER ()
-
GPOINTER_TO_UINT ()
Listas doblemente enlazadas.
El TDA lista doblemente enlazada, al
igual que la lista enlazada, es un TDA dinámico lineal pero, a diferencia de este, cada nodo de la
lista doblemente enlazada contiene dos punteros, de forma
que uno apunta al siguiente nodo y el otro al
predecesor. Esta característica, permite que se pueda
recorrer la lista en ambos sentidos, cosa que no es posible
en las listas simples.
La declaración del tipo lista doblemente enlazada de enteros
es la siguiente:
struct lista_doble { gint dato; lista_doble *siguiente; lista_doble *anterior; };
|
Representa el dato a almacenar, que puede ser de
cualquier tipo. En este ejemplo se
trataría de una lista de enteros.
|
|
Se trata de un puntero al siguiente elemento de la
lista. Con este puntero se enlaza con el sucesor, de
forma que podamos construir la lista.
|
|
Es un puntero al elemento anterior de la lista. Este
puntero enlaza con el elemento predecesor de la lista
y permite recorrerla en sentido inverso.
|
Sobre este TDA se definen los mismos
operadores básicos que en las listas simples.
GQueue: pilas y colas.
Otra de las novedades que incorpora esta versión de
GLib™ es la estructura
GQueue que, junto con las funciones
que la acompañan, nos proporciona la posibilidad de
implementar los TDA cola y pila estándar.
GQueue utiliza estructuras
GList para almacenar los
elementos. La declaración de la estructura de datos es la
siguiente.
struct GQueue { GList *head; GList *tail; guint length; };
|
Es un puntero al primer elemento de la cola.
|
|
Es un puntero al último elemento de la cola.
|
|
Esta variable almacena el número de elementos de la
cola.
|
Aunque para referirnos al TDA GQueue utilizamos el término cola,
con esta misma estructura también tenemos la posibilidad de
implementar el TDA pila, gracias a las
funciones que lo acompañan.
Una cola es una estructura de datos donde el primer elemento
en entrar es el primero en salir, también denominadas
estructuras FIFO (First In,
First Out).
Esta estructura de datos se puede definir como una lista
enlazada con acceso FIFO a la que sólo se
tiene acceso al final de la lista para meter elementos y al
principio de esta para sacarlos.
Los operadores asociados a este TDA y las
funciones que los implementan en
GLib™ son:
Tabla 14. Operadores asociados al TDA Cola.
Operador
|
Funciones asociadas a GQueue.
|
Iniciar cola.
|
GQueue* g_queue_new (void)
|
Cola vacía.
|
gboolean g_queue_is_empty (GQueue* queue)
|
Consultar frente cola.
|
gpointer g_queue_peek_head (GQueue* queue)
|
Consultar final cola.
|
gpointer g_queue_peek_tail (GQueue* queue)
|
Meter
|
void g_queue_push_tail (GQueue* queue, gpointer data)
|
Sacar
|
gpointer g_queue_pop_head (GQueue* queue)
|
Vaciar cola.
|
void g_queue_free (GQueue* queue)
|
El operador "Iniciar cola" es el encargado de crear una
nueva cola y ponerla en estado de cola vacía.
Ejemplo 23. Creando una nueva cola. GQueue* cola; cola = g_queue_new ();
-
Pilas
Una pila, es una estructura de datos en la que el último
elemento en entrar es el primero en salir, opr lo que
también se denominan estructuras LIFO (Last In, First Out).
En esta estructura sólo se tiene acceso a la cabeza o cima
de la pila.
Los operadores asociados a este TDA y las
funciones que los implementan en
GLib™ son:
Tabla 15. Operadores asociados al TDA Pila.
Operador
|
Funciones asociadas a GQueue.
|
Iniciar pila.
|
GQueue* g_queue_new (void)
|
Pila vacía.
|
gboolean g_queue_is_empty (GQueue* queue)
|
Consultar pila.
|
gpointer g_queue_peek_head (GQueue* queue)
|
Meter.
|
void g_queue_push_head (GQueue* queue, gpointer data)
|
Sacar.
|
gpointer g_queue_pop_head (GQueue* queue)
|
Vaciar pila.
|
void g_queue_free (GQueue* queue)
|
El operador "iniciar pila" es el encargado de crear una
nueva pila y inicializarla al estado de pila vacía.
Ejemplo 30. Creando una nueva pila. GQueue* pila; pila = g_queue_new ();
|