Você está na página 1de 19

ESTRUCTURAS DE DATOS

SEMANA 6
Listas doblemente
enlazadas

Todos los derechos de autor son de la exclusiva propiedad de IACC o de los otorgantes de sus licencias. No está
permitido copiar, reproducir, reeditar, descargar, publicar, emitir, difundir, poner a disposición del público ni 1
ESTE
utilizarDOCUMENTO
los contenidos paraCONTIENE LAdeSEMANA
fines comerciales 6
ninguna clase.
2
ESTE DOCUMENTO CONTIENE LA SEMANA 6
ÍNDICE

OBJETIVO ESPECÍFICO ......................................................................................................................... 4


INTRODUCCIÓN ................................................................................................................................... 4
1. LISTAS DOBLEMENTE ENLAZADAS .............................................................................................. 5
1.1. CONCEPTO DE LISTAS DOBLEMENTE ENLAZADA ................................................................ 5
1.2. OPERACIONES CON LISTAS DOBLEMENTE ENLAZADAS ...................................................... 7
1.2.1. LISTAR .............................................................................................................................. 7
1.2.2. INSERTAR ......................................................................................................................... 8
1.2.3. BORRAR ........................................................................................................................... 8
1.2.4. RECORRER ....................................................................................................................... 9
1.2.5. BÚSQUEDA .................................................................................................................... 10
1.3. UTILIZACIÓN DE LISTAS DOBLEMENTE ENLAZADAS ......................................................... 11
1.3.1. EJEMPLO OPERADOR INSERTAR .................................................................................... 11
1.3.2. EJEMPLO DEL OPERADOR BORRAR ............................................................................... 12
1.4. APLICACIONES CON LISTAS DOBLEMENTE ENLAZADAS.................................................... 13
1.4.1. LISTAR-RECORRER-BUSCAR ........................................................................................... 13
COMENTARIO FINAL.......................................................................................................................... 17
REFERENCIAS ..................................................................................................................................... 18

3
ESTE DOCUMENTO CONTIENE LA SEMANA 6
LISTAS DOBLEMENTE ENLAZADAS

OBJETIVO ESPECÍFICO
 Comprender las operaciones y utilización de listas doblemente enlazada.

INTRODUCCIÓN
Una lista doblemente es una estructura de datos que consiste en un conjunto de nodos enlazados
de manera secuencial, donde cada nodo contiene un par de campos denominados enlaces, que
hacen referencia al nodo siguiente y al anterior en la secuencia de nodos. Un campo de enlace
permite atravesar la lista hacia adelante, mientras que el otro permite atravesar la lista haca atrás.
El doble enlace de los nodos permite recorrer la lista en cualquier dirección.

4
ESTE DOCUMENTO CONTIENE LA SEMANA 6
1. LISTAS DOBLEMENTE ENLAZADAS

1.1. CONCEPTO DE LISTAS DOBLEMENTE ENLAZADA


Para comprender el concepto de lista doblemente enlazada, hay que recordar que las listas
enlazadas originalmente fueron creadas para intentar darle solución a diferentes problemas de
programación en los inicios de la informática, sin embargo en la actualidad ya no se implementan
y han quedado restringidas a los sistemas operativos, pues son más dinámicas que los arreglos.

Las ventajas de una lista enlazada:

 Inserción y extracción de nodos con coste independiente del tamaño de la lista.


 Concatenación y partición listas con coste independiente del tamaño de las listas.
 No hay necesidad de grandes cantidades de memoria contigua.
 El uso de memoria se adapta dinámicamente al número de datos almacenados en la lista en
cada momento.

Por otra parte sus desventajas son:

 Acceso a posiciones intermedias con coste dependiente del tamaño de la lista.


 Necesidad de memoria adicional para almacenar los objetos nodos con sus atributos.

Las listas doblemente enlazadas revierten esas dificultades.

Una lista doblemente enlazada es una estructura de datos semejante a la lista enlazada, su
asignación de memoria es hecha al momento de la ejecución; es también una lista lineal en la que
cada nodo tiene dos enlaces: uno al nodo siguiente y otro al anterior. Las listas doblemente
enlazadas no necesitan un nodo especial para acceder a ellas, pueden recorrerse en ambos
sentidos a partir de cualquier nodo, esto es porque, a partir de cualquier nodo, siempre es posible
alcanzar cualquier nodo de la lista, hasta que se llega a uno de los extremos. El movimiento a
través de listas doblemente enlazadas es más sencillo.

Para acceder a un elemento, la lista puede ser recorrida en ambos sentidos:

 Al comenzar por el inicio, el puntero1 siguiente permite el desplazamiento hacia el próximo


elemento.

1
Un puntero es una variable que almacena la dirección de memoria de otra variable, es decir, almacena el
valor del lugar físico en la memoria en donde se encuentra almacenada dicha variable. Si se imagina que la
memoria del computador es un gran arreglo de bytes, la dirección de memoria correspondería al índice de
los casilleros de dicho arreglo, que es precisamente lo que se almacena en el puntero. Ver más en:
https://users.dcc.uchile.cl/~bebustos/apuntes/cc30a/Estructuras/

5
ESTE DOCUMENTO CONTIENE LA SEMANA 6
 Al comenzar por el final, el puntero anterior permite el desplazamiento hacia el elemento
anterior.

Las operaciones básicas de una lista doblemente enlazada son:

 Insertar: incluye un nodo con dato x en la lista, pudiendo realizarse esta inserción al principio
o final de la lista o bien en orden.

 Eliminar: excluye un nodo de la lista, puede ser según la posición o por el dato.

 Buscar: rastrea un elemento en la lista.

 Localizar: ubica la posición del nodo en la lista.

 Imprimir: imprime los elementos de la lista.

Una lista doblemente ligada es una colección de nodos, en la cual uno de ellos tiene dos
apuntadores, uno apuntando a su predecesor y otro a su sucesor. Por medio de estos punteros se
podrá entonces avanzar o retroceder a través de la lista, según se tomen las direcciones de uno u
otro apuntador (Cairó y Guardati, 2006).

Estructura de un nodo en una lista doblemente enlazada

“Como una lista doble es una estructura dinámica, no es necesario establecer su tamaño, ya que
crece su demanda de memoria conforme se agregan elementos y se libera cuando son
eliminados” (López, 2012, p. 263).
“Una lista doble puede representarse utilizando apuntadores o referencias que definen la
secuencia de nodos que contiene. Sin embargo, se requiere identificar el primer nodo de la lista,
lo cual se logra mediante un apuntador al nodo inicial y el último nodo, mediante un apuntador
al nodo final, mientras cada nodo tiene un apuntador tanto a su antecesor como a su sucesor
(excepto el primero que no tiene antecesor y el último que no tiene sucesor). Lo anterior permite
recorrer la lista doble en ambos sentidos” (López, 2012, p. 263).

6
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Representación gráfica de una lista doblemente enlazada

Fuente: https://goo.gl/ZBcufx

1.2. OPERACIONES CON LISTAS DOBLEMENTE ENLAZADAS


A continuación se profundizará en la descripción de cada una de las operaciones con listas
doblemente enlazadas:

1.2.1. LISTAR

Dentro del tipo abstracto de listas doblemente enlazadas se encuentran las siguientes primitivas:

 tLista crear ()
 void destruir (tLista l)
 tPosicion primero (tLista l)
 tPosicion fin (tLista l)
 void insertar (tElemento x, tPosicion p, tLista l)
 void borrar (tPosicion *p, tLista l)
 tElemento elemento(tPosicion p, tLista l)
 tPosicion siguiente (tPosicion p, tLista l)
 tPosicion anterior (tPosicion p, tLista l)
 tPosicion posicion (tElemento x, tLista l)

Por ejemplo:

tLista crear ()
Argumentos: Ninguno.
Efecto: (Constructor primitivo). Crea un objeto del tipo tLista

2
“Null no es un valor. Es un estado que indica que el valor de ese ítem es desconocido o no existente”. Ver
más en: http://firebirdsql.org/manual/es/nullguide-es-queesnull.html

7
ESTE DOCUMENTO CONTIENE LA SEMANA 6
1.2.2. INSERTAR

La operación insertar agrega un nodo a la lista doblemente enlazada. Debido a que la lista
doblemente enlazada es dinámica, cuando se inserta un nuevo nodo se tiene que crear el espacio
de memoria para almacenarlo y acomodarlo mediante los punteros correspondientes (López,
2012).

“La inserción de un elemento consiste en agregar un nuevo nodo a la lista y establecer los
puntadores correspondientes” (Cairó y Guardati, 2006, p. 160).

Insertar elemento en una lista doblemente enlazada:

Esta operación dependerá de si la lista está vacía o no:

1) Si Lista está vacía se hace que Lista apunte a nodo. Y nodo->anterior y nodo->siguiente a NULL.
2) Si Lista no está vacía, se hace que nodo->siguiente apunte a Lista->siguiente.

 Después que Lista->siguiente apunte a nodo.


 Luego, se hace que nodo->anterior apunte a Lista.
 Si nodo->siguiente no es NULL, entonces se hace que nodo->siguiente->anterior apunte a
nodo.

Ejemplo gráfico de inserción de un nodo en una lista doblemente enlazada

Fuente: https://goo.gl/DSz9nl (slide 4)

1.2.3. BORRAR

La operación borrar elimina un nodo de la lista doblemente enlazada. Como la lista doblemente
enlazada es dinámica, cuando se elimina un nodo se libera espacio de memoria y se ajustan los
punteros correspondientes para mantener la secuencia lógica. Antes de efectuar la operación,
tiene que validarse que la lista doblemente enlazada no este vacía, lo cual se logra verificando si el
nodo inicial o el nodo final apuntan a null (nulo) (López, 2012).

8
ESTE DOCUMENTO CONTIENE LA SEMANA 6
La operación de eliminación de un nodo en una lista doblemente ligada, al igual que en

el caso de las listas simplemente ligadas, consiste en eliminar un elemento de la lista,

redefiniendo los apuntadores correspondientes y liberando el espacio de memoria

ocupado por el nodo (Cairó y Guardati, 2006, p. 163).

Borrar un nodo de una lista doblemente enlazada:

Se tiene dos casos posibles: que el nodo a borrar esté apuntado por Lista o que no. Si lo está,
simplemente se hace que Lista sea Lista->anterior, si no es NULL o Lista->siguiente.
1) Si nodo apunta a Lista:

 Si Lista->anterior no es NULL se hace que Lista apunte a Lista->anterior.


 Si Lista->siguiente no es NULL se hace que Lista apunte a Lista->siguiente.
 Si ambos son NULL, se hace que Lista sea NULL.

2) Si nodo->anterior no es NULL, se hace que nodo->anterior->siguiente apunte a nodo->siguiente.

3) Si nodo->siguiente no es NULL, se hace que nodo->siguiente->anterior apunte a nodo->anterior.

4) Se borra el nodo apuntado por nodo.

Ejemplo gráfico de eliminación de un nodo en una lista doblemente enlazada

Fuente: https://goo.gl/DSz9nl (slide 5)

1.2.4. RECORRER

Esta operación implica seguir el encadenamiento lógico implementado por los punteros, ya que el
acomodo lógico de los nodos no siempre coincide con el ordenamiento físico. En una lista
doblemente enlazada el recorrido puede realizarse en ambas direcciones, ya sea empezando por
el nodo inicial y visitando sucesivamente el nodo indicado por el puntero siguiente o empezando
por el nodo final y consultando una y otra vez el nodo indicado por el puntero anterior (López,
2012).

9
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Al tener cada nodo una doble liga, la lista se puede recorrer tanto del inicio al final,

mediante las ligas derechas, como en el sentido inverso; es decir, del final al principio con

las ligas izquierdas. Cualquiera sea la dirección del recorrido, el algoritmo es similar al que

se presenta para listas simplemente ligadas (Cairó y Guardati, 2006, p. 160).

1.2.5. BÚSQUEDA

Esta operación consiste en recorrer la estructura para localizar un nodo en particular en la lista
doblemente enlazada y consultar su información. El recorrido puede hacerse en ambas
direcciones, pero debido al ordenamiento lógico de los nodos no siempre es necesario recorrerla
completa para localizar el nodo deseado (López, 2012).

En muchos aspectos, una lista doblemente enlazada se comporta como dos listas abiertas que
comparten los datos. En ese sentido, se tiene la ventaja de que se puede avanzar y retroceder
desde cualquier nodo, sin necesidad de volver a uno de los extremos de la lista.

Por otra parte, se pueden hacer listas doblemente enlazadas no ordenadas y existen cientos de
problemas que pueden requerir de este tipo de estructuras. Sin embargo, la aplicación más
sencilla de listas doblemente enlazadas es hacer arreglos dinámicos ordenados, donde buscar un
elemento concreto a partir de cualquier otro es más sencillo que en una lista abierta corriente. Por
ejemplo:

Para recorrer una lista se procederá de un modo parecido al que se usa con las listas abiertas, sin
embargo no se necesita un puntero auxiliar, pero hay que tener en cuenta que Lista no tiene por
qué estar en uno de los extremos para iniciar la búsqueda:

1) Retroceder hasta el comienzo de la lista y asignar a esta el valor de lista->anterior mientras lista
->anterior no sea NULL.

2) Abrir un bucle que debe tener una condición al menos y que el índice no sea NULL.

3) Dentro del bucle se asignará a la lista el valor del nodo siguiente al actual.

10
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Ejemplo gráfico de búsqueda a través de la lista doblemente enlazada

Fuente: https://goo.gl/DSz9nl (slide 16)

1.3. UTILIZACIÓN DE LISTAS DOBLEMENTE ENLAZADAS

1.3.1. EJEMPLO OPERADOR INSERTAR

A continuación se puede observar cómo insertar el nodo 10 al final de una lista doblemente
enlazada:

El proceso es el siguiente:

1) Nodo^.siguiente debe apuntar a Lista^.siguiente (NULL).

2) Lista^.siguiente debe apuntar a nodo.

3) Nodo^.anterior apuntará a Lista.

11
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Fuente: https://goo.gl/xEpJ8A (slide 3)

1.3.2. EJEMPLO DEL OPERADOR BORRAR

A continuación se puede observar cómo borrar el nodo 9 de la siguiente lista doblemente


enlazada:

Fuente: https://goo.gl/xEpJ8A (slide 6)

Para eliminar el nodo 9 se debe modificar el puntero siguiente del nodo anterior (3) para que
apunte al nodo siguiente del nodo que se eliminó (12) y el puntero anterior del nodo siguiente (12)
para que apunte al nodo anterior (3) del nodo que se eliminó (9).

12
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Fuente: https://goo.gl/xEpJ8A (slide 6)

Una vez eliminado el nodo 9 la lista doblemente enlazada quedará así:

Fuente: https://goo.gl/xEpJ8A (slide 6)

1.4. APLICACIONES CON LISTAS DOBLEMENTE ENLAZADAS

1.4.1. LISTAR-RECORRER-BUSCAR

Un ferrocarril puede ser considerado un ejemplo de la vida cotidiana que representa una lista
doblemente enlazada, ya que cada vagón tiene un enganche en cada extremo (simulando el
puntero anterior y el puntero siguiente), de tal forma que enlaza el vagón anterior y otro posterior
(excepto el primero que no tiene vagón anterior y el último que no tiene vagón sucesor) (López,
2012).

Fuente: material elaborado para esta asignatura.

13
ESTE DOCUMENTO CONTIENE LA SEMANA 6
Dos de las aplicaciones más conocidas de las listas son la representación de polinomios y
resolución de colisiones (hash). En general, se puede señalar que las listas doblemente enlazadas
son muy útiles para aquellas aplicaciones en que se necesite el dinamismo en el crecimiento y
reducción de la estructura de datos usada para el almacenamiento de la información (Cairó y
Guardati, 2006).
3
Implementación del método insertar en el lenguaje de programación C

typedef struct celda {


tElemento elemento;
struct celda *siguiente,*anterior;
} tipocelda;

typedef tipocelda *tPosicion;


typedef tipocelda *tLista;

static void error(char *cad)


{
fprintf(stderr, "ERROR: %s\n", cad);
exit(1);
}

tLista Crear()
{
tLista l;

l = (tLista)malloc(sizeof(tipocelda));
if (l == NULL)
Error("Memoria insuficiente.");
l->siguiente = l->anterior = l;
return l;
}

void Destruir (tLista l)


{
tPosicion p;

for (p=l, l->anterior->siguiente=NULL; l!=NULL; p=l) {


l = l->siguiente;
free(p);
}

3
También conocido como lenguaje de programación de sistemas, es un sistema operativo multiplataforma.
“El lenguaje C es del tipo lenguaje estructurado como son Pascal, Fortran, Basic. Sus instrucciones son muy
parecidas a otros lenguajes incluyendo sentencias como if, else, for, do y while”. Ver más:
https://www.ecured.cu/Lenguaje_de_Programaci%C3%B3n_C

14
ESTE DOCUMENTO CONTIENE LA SEMANA 6
}

tPosicion Primero (tLista l)


{
return l->siguiente;
}

tPosicion Fin (tLista l)


{
return l;
}

void Insertar (tElemento x, tPosicion p, tLista l)


{
tPosicion nuevo;

nuevo = (tPosicion)malloc(sizeof(tipocelda));
if (nuevo == NULL)
Error("Memoria insuficiente.");
nuevo->elemento = x;
nuevo->siguiente = p;
nuevo->anterior = p->anterior;
p->anterior->siguiente = nuevo;
p->anterior = nuevo;
}

void Borrar (tPosicion *p, tLista l)


{
tPosicion q;
if (*p == l){
Error("Posicion fin(l)");
}
q = (*p)->siguiente;
(*p)->anterior->siguiente = q;
q->anterior = (*p)->anterior;
free(*p);
(*p) = q;
}

tElemento elemento(tPosicion p, tLista l)


{

if (p == l){
Error("Posicion fin(l)");
}
return p->elemento;
}

15
ESTE DOCUMENTO CONTIENE LA SEMANA 6
tPosicion siguiente (tPosicion p, tLista l)
{
if (p == l){
Error("Posicion fin(l)");
}
return p->siguiente;
}

tPosicion anterior( tPosicion p, tLista l)


{
if (p == l->siguiente){
Error("Posicion primero(l)");
}
return p->anterior;
}

tPosicion posicion (tElemento x, tLista l)


{
tPosicion p;
int encontrado;

p = primero(l);
encontrado = 0;
while ((p != fin(l)) && (!encontrado))
if (p->elemento == x)
encontrado = 1;
else
p = p->siguiente;
return p;
}

16
ESTE DOCUMENTO CONTIENE LA SEMANA 6
COMENTARIO FINAL
Una lista doblemente enlazada es una lista lineal en la que cada nodo tiene dos enlaces, uno al
nodo siguiente y otro al nodo anterior. Los enlaces se implementan mediante punteros.

Las listas doblemente enlazadas no necesitan un nodo especial para acceder a ellas, pueden
recorrerse en ambos sentidos a partir de cualquier nodo, esto porque a partir de cualquier nodo
siempre es posible alcanzar cualquier nodo de la lista, hasta que se llega a uno de los extremos.

Las listas doblemente enlazadas tienen la ventaja de que en ellas se puede avanzar y retroceder
desde cualquier nodo, sin necesidad de volver a uno de los extremos de la lista.

Además, se pueden crear listas doblemente enlazadas no ordenadas y se debe considerar que
existen cientos de problemas que pueden requerir de este tipo de estructuras.

17
ESTE DOCUMENTO CONTIENE LA SEMANA 6
REFERENCIAS
Cairó, O. y Guardati, S. (2006). Estructura de datos. 3.ª edición. México: Mc Graw Hill.

López, B. (2012). Estructura de datos orientado a objetos. 1.ª edición. México: Alfaomega.

PARA REFERENCIAR ESTE DOCUMENTO, CONSIDERE:

IACC (2017). Listas doblemente enlazadas. Estructuras de Datos. Semana 6.

18
ESTE DOCUMENTO CONTIENE LA SEMANA 6
19
ESTE DOCUMENTO CONTIENE LA SEMANA 6

Você também pode gostar