Sie sind auf Seite 1von 16

ESTRUCTURA DE DATOS

SEMANA 3
ÍNDICE
LISTAS DOBLEMENTE ENLAZADAS ...................................................................................................... 3
OBJETIVOS ESPECÍFICOS ...................................................................................................................... 3
INTRODUCCIÓN ................................................................................................................................... 3
1. CONCEPTO DE LISTA DOBLEMENTE ENLAZADA .......................................................................... 3
2. OPERACIONES CON LISTAS DOBLEMENTE ENLAZADAS .............................................................. 5
2.1. INSERTAR ................................................................................................................................. 5
2.2. BORRAR ................................................................................................................................... 5
2.3. RECORRER ............................................................................................................................... 6
2.4. BÚSQUEDA .............................................................................................................................. 6
3. UTILIZACIÓN DE LISTAS DOBLEMENTE ENLAZADAS ................................................................... 7
3.1. EJEMPLO DEL OPERADOR INSERTAR ....................................................................................... 7
3.2. EJEMPLO DEL OPERADOR BORRAR ......................................................................................... 8
4. APLICACIONES CON LISTAS DOBLEMENTE ENLAZADAS.............................................................. 9
COMENTARIO FINAL.......................................................................................................................... 15
REFERENCIAS ..................................................................................................................................... 16

2
ESTE DOCUMENTO CONTIENE LA SEMANA 3
LISTAS DOBLEMENTE ENLAZADAS

OBJETIVOS ESPECÍFICOS
Se espera que, al finalizar esta semana, el estudiante sea capaz de:

 Reconocer el concepto y las características funcionales de las Listas doblemente


enlazadas.
 Distinguir los operadores básicos de una Lista doblemente enlazada.
 Utilizar Listas doblemente enlazadas para programar algoritmos al interior de
problemáticas planteadas.

INTRODUCCIÓN
La lista enlazada tiene la característica que solamente puede ser recorrida en un sentido,
empezando el recorrido por el nodo inicial y visitando cada nodo a través de los punteros hasta
llegar al nodo final; sin embargo, hay situaciones en la que se requiere recorrer la lista en ambos
sentidos, ya sea del inicio al fin o del fin al inicio.

Por lo anterior, surge la necesidad de contar con una nueva estructura de datos: La lista
doblemente enlazada, que va a tener la característica de poder ser recorrida en ambos sentidos.

1. CONCEPTO DE LISTA DOBLEMENTE ENLAZADA


Una lista doble es una estructura de datos que se compone de un conjunto de nodos en

secuencia que están encadenados mediante apuntadores. También es una estructura de

datos dinámica cuya característica es que cada nodo consta de tres partes: la información

que almacena, el apuntador al siguiente nodo y el apuntador al nodo anterior (López,

2012, p. 263).

3
ESTE DOCUMENTO CONTIENE LA SEMANA 3
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ó, 2006).

Estructura de un nodo en una lista doblemente enlazada

Fuente: (Universidad Francisco de Paula Santander, UFPS, 2014). Recuperado de


http://ingsistemas.ufps.edu.co/SEED/listas.html#. 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).

Representación gráfica de una lista doblemente enlazada

Fuente: (Universidad Francisco de Paula Santander, UFPS, 2014). Recuperado de


http://ingsistemas.ufps.edu.co/SEED/listas.html#. Lista Doblemente Enlazada.

4
ESTE DOCUMENTO CONTIENE LA SEMANA 3
2. OPERACIONES CON LISTAS DOBLEMENTE ENLAZADAS
Las operaciones que se pueden llevar a cabo en este tipo de estructura son las mismas que en las
listas enlazadas. Se estudiarán las operaciones de insertar, borrar, recorrer y búsqueda.

2.1. 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 apuntadores correspondientes” (Cairó, 2006, p. 160).

2.2. 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 nulo (López, 2012).

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ó, 2006, p. 163).

5
ESTE DOCUMENTO CONTIENE LA SEMANA 3
2.3. RECORRER
Esta operación corresponde a seguir el encadenamiento lógico implementado por los punteros, ya
que el acomodo lógico de los nodos no necesariamente 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 sucesivamente el nodo indicado por el puntero
anterior (López, 2012).

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ó, 2006, p. 160).

2.4. 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).

6
ESTE DOCUMENTO CONTIENE LA SEMANA 3
3. UTILIZACIÓN DE LISTAS DOBLEMENTE ENLAZADAS

3.1. EJEMPLO DEL OPERADOR INSERTAR


A continuación se puede observar cómo insertar los nodos 25, 4 y 23 a una lista doblemente
enlazada.

Fuente: (Universidad Francisco de Paula Santander, UFPS, 2014). Recuperado de


http://ingsistemas.ufps.edu.co/SEED/listas.html#. Lista Doblemente Enlazada.

7
ESTE DOCUMENTO CONTIENE LA SEMANA 3
3.2. EJEMPLO DEL OPERADOR BORRAR
A continuación se puede observar cómo borrar el nodo 29 de la siguiente lista doblemente
enlazada.

Fuente: (Universidad Francisco de Paula Santander, UFPS, 2014). Recuperado de


http://ingsistemas.ufps.edu.co/SEED/listas.html#. Lista Doblemente Enlazada.

Para eliminar el nodo 29 se debe modificar el puntero siguiente del nodo anterior (18) para que
apunte al nodo siguiente del nodo que se eliminó (46) y el puntero anterior del nodo siguiente (46)
para que apunte al nodo anterior del nodo que se eliminó (18).

Fuente: (Universidad Francisco de Paula Santander, UFPS, 2014). Recuperado de


http://ingsistemas.ufps.edu.co/SEED/listas.html#. Lista Doblemente Enlazada.

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

Fuente: (Universidad Francisco de Paula Santander, UFPS, 2014). Recuperado de


http://ingsistemas.ufps.edu.co/SEED/listas.html#. Lista Doblemente Enlazada.

8
ESTE DOCUMENTO CONTIENE LA SEMANA 3
4. APLICACIONES CON LISTAS DOBLEMENTE ENLAZADAS
Un ferrocarril puede ser considerado un caso 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).

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ó, 2006).

9
ESTE DOCUMENTO CONTIENE LA SEMANA 3
Implementación del método insertar en el Lenguaje de Programación C

void Insertar(Lista *lista, int v) {


pNodo nuevo, actual;

/* Crear un nodo nuevo */


nuevo = (pNodo)malloc(sizeof(tipoNodo));
nuevo->valor = v;

/* Colocamos actual en la primera posición de la lista */


actual = *lista;
if(actual) while(actual->anterior) actual = actual->anterior;

/* Si la lista está vacía o el primer miembro es mayor que el nuevo */


if(!actual || actual->valor > v) {
/* Añadimos la lista a continuación del nuevo nodo */
nuevo->siguiente = actual;
nuevo->anterior = NULL;
if(actual) actual->anterior = nuevo;
if(!*lista) *lista = nuevo;
}
else {
/* Avanzamos hasta el último elemento o hasta que el siguiente tenga
un valor mayor que v */
while(actual->siguiente && actual->siguiente->valor <= v)
actual = actual->siguiente;
/* Insertamos el nuevo nodo después del nodo anterior */
nuevo->siguiente = actual->siguiente;
actual->siguiente = nuevo;
nuevo->anterior = actual;
if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;
}
}

Fuente: (Universidad Francisco de Paula Santander, UFPS, 2014) Recuperado de


http://www.c.conclase.net/edd/?cap=005d#inicio

10
ESTE DOCUMENTO CONTIENE LA SEMANA 3
Implementación del método borrar en el Lenguaje de Programación C

void Borrar(Lista *lista, int v) {


pNodo nodo;

/* Buscar el nodo de valor v */


nodo = *lista;
while(nodo && nodo->valor <v) nodo = nodo->siguiente;
while(nodo && nodo->valor > v) nodo = nodo->anterior;

/* El valor v no está en la lista */


if(!nodo || nodo->valor != v) return;

/* Borrar el nodo */
/* Si lista apunta al nodo que queremos borrar, apuntar a otro */
if(nodo == *lista)
if(nodo->anterior) *lista = nodo->anterior;
else *lista = nodo->siguiente;

if(nodo->anterior) /* no es el primer elemento */


nodo->anterior->siguiente = nodo->siguiente;
if(nodo->siguiente) /* no es el último nodo */
nodo->siguiente->anterior = nodo->anterior;
free(nodo);
}

Fuente: (Universidad Francisco de Paula Santander, UFPS, 2014) Recuperado de


http://www.c.conclase.net/edd/?cap=005d#inicio

11
ESTE DOCUMENTO CONTIENE LA SEMANA 3
Implementación de listas doblemente enlazadas en lenguaje de programación C

#include <stdlib.h>
#include <stdio.h>

#define ASCENDENTE 1
#define DESCENDENTE 0

typedef struct _nodo {


int valor;
struct _nodo *siguiente;
struct _nodo *anterior;
} tipoNodo;

typedef tipoNodo *pNodo;


typedef tipoNodo *Lista;

/* Funciones con listas: */


void Insertar(Lista *l, int v);
void Borrar(Lista *l, int v);

void BorrarLista(Lista *);


void MostrarLista(Lista l, int orden);

int main()
{
Lista lista = NULL;
pNodo p;

Insertar(&lista, 20); Insertar(&lista, 10); Insertar(&lista, 40); Insertar(&lista, 30);

MostrarLista(lista, ASCENDENTE);
MostrarLista(lista, DESCENDENTE);

Borrar(&lista, 10); Borrar(&lista, 15); Borrar(&lista, 45); Borrar(&lista, 30);

MostrarLista(lista, ASCENDENTE);
MostrarLista(lista, DESCENDENTE);

BorrarLista(&lista);
system("PAUSE");
return 0;
}

void Insertar(Lista *lista, int v)


{
pNodo nuevo, actual;

12
ESTE DOCUMENTO CONTIENE LA SEMANA 3
/* Crear un nodo nuevo */
nuevo = (pNodo)malloc(sizeof(tipoNodo));
nuevo->valor = v;

/* Colocamos actual en la primera posición de la lista */


actual = *lista;
if(actual) while(actual->anterior) actual = actual->anterior;
/* Si la lista está vacía o el primer miembro es mayor que el nuevo*/
if(!actual || actual->valor > v) {
/* Añadimos la lista a continuación del nuevo nodo */
nuevo->siguiente = actual;
nuevo->anterior = NULL;
if(actual) actual->anterior = nuevo;
if(!*lista) *lista = nuevo;
}
else {
/* Avanzamos hasta el último elemento o hasta que el siguiente tenga
un valor mayor que v */
while(actual->siguiente && actual->siguiente->valor <= v)
actual = actual->siguiente;
/* Insertamos el nuevo nodo después del nodo anterior */
nuevo->siguiente = actual->siguiente;
actual->siguiente = nuevo;
nuevo->anterior = actual;
if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;
}
}

void Borrar(Lista *lista, int v)


{
pNodo nodo;

/* Buscar el nodo de valor v */


nodo = *lista;
while(nodo && nodo->valor < v) nodo = nodo->siguiente;
while(nodo && nodo->valor > v) nodo = nodo->anterior;

/* El valor v no está en la lista */


if(!nodo || nodo->valor != v) return;

/* Borrar el nodo */
/* Si lista apunta al nodo que queremos borrar, apuntar a otro */
if(nodo == *lista)
if(nodo->anterior) *lista = nodo->anterior;
else *lista = nodo->siguiente;

if(nodo->anterior) /* no es el primer elemento */


nodo->anterior->siguiente = nodo->siguiente;

13
ESTE DOCUMENTO CONTIENE LA SEMANA 3
if(nodo->siguiente) /* no es el último nodo */
nodo->siguiente->anterior = nodo->anterior;
free(nodo);
}

void BorrarLista(Lista *lista)


{
pNodo nodo, actual;

actual = *lista;
while(actual->anterior) actual = actual->anterior;

while(actual) {
nodo = actual;
actual = actual->siguiente;
free(nodo);
}
*lista = NULL;
}

void MostrarLista(Lista lista, int orden)


{
pNodo nodo = lista;

if(!lista) printf("Lista vacía");

nodo = lista;
if(orden == ASCENDENTE) {
while(nodo->anterior) nodo = nodo->anterior;
printf("Orden ascendente: ");
while(nodo) {
printf("%d -> ", nodo->valor);
nodo = nodo->siguiente;
}
}
else {
while(nodo->siguiente) nodo = nodo->siguiente;
printf("Orden descendente: ");
while(nodo) {
printf("%d -> ", nodo->valor);
nodo = nodo->anterior;
}
}
printf("\n");
}

Fuente: (Universidad Francisco de Paula Santander, UFPS, 2014) Recuperado de


http://www.c.conclase.net/edd/index.php?cap=ejemplos#inicio

14
ESTE DOCUMENTO CONTIENE LA SEMANA 3
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 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, existen cientos de problemas
que pueden requerir de este tipo de estructuras.

15
ESTE DOCUMENTO CONTIENE LA SEMANA 3
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.

Universidad Francisco de Paula Santander (UFPS). Listas Doblemente Enlazadas. Recuperado de

http://www.c.conclase.net/edd/?cap=005#5_1

Listas. Recuperado de http://ingsistemas.ufps.edu.co/SEED/listas.html#. Lista Doblemente

Enlazada.

PARA REFERENCIAR ESTE DOCUMENTO, CONSIDERE:

IACC (2014). Listas Doblemente Enlazadas. Estructura de Datos. Semana 3.

16
ESTE DOCUMENTO CONTIENE LA SEMANA 3

Das könnte Ihnen auch gefallen