Análisis y Diseño de Algoritmos
Prof: Ing. Victor Garro
Asistente: Marco Elizondo Vargas
Listas
Lineales
CONCEPTO
Listas Dobles
Una lista doble , ó doblemente ligada es una colección de nodos en la cual cada nodo tiene dos punteros, uno de ellos apuntando a su predecesor (li) y otro a su sucesor(ld). Por medio de estos punteros se podrá avanzar o retroceder a través de la lista, según se tomen las direcciones de uno u otro puntero.
La estructura de un nodo en una lista doble es la siguiente:

Existen dos tipos de listas doblemente ligadas:
Debido a que las listas dobles circulares son más eficientes, los algoritmos que en esta sección se traten serán sobre listas dobles circulares.
En la figura siguiente se muestra un ejemplo de una lista doblemente ligada lineal que almacena números:

En la figura siguiente se muestra un ejemplo de una lista doblemente ligada circular que almacena números:

A continuación mostraremos algunos algoritmos sobre listas enlazadas. Como ya se mencionó, llamaremos li al puntero izquierdo y ld al puntero derecho, también usaremos el apuntador top para hacer referencia al primer nodo en la lista, y p para referenciar al nodo presente.
top<--NILrepite si top=NIL entonces new(p)lee(p(dato))
p(ld)<--p p(li)<--p top<--p en caso contrario new(p)lee(p(dato))
p(ld)<--top p(li)<--p p(ld(li))<--p mensaje(otro nodo?) lee (respuesta)hasta respuesta=no
--RECORRIDO A LA DERECHA. p<--toprepite escribe(p(dato)) p<--p(ld)hasta p=top --RECORRIDO A LA IZQUIERDA. p<--toprepite escribe(p(dato)) p<--p(li)hasta p=top(li)
p<--topmensaje (antes de ?)lee(x)repite si p(dato)=x entonces new(q) leer(q(dato)) si p=top entoncestop<--q
q(ld)<--p q(li)<--p(li) p(ld(li))<--q p(li)<--q p<--top en caso contrario p<--p(ld)hasta p=top
p<--topmensaje(despues de ?)lee(x)repite si p(dato)=x entonces new(q) lee(q(dato)) q(ld)<--p(ld) q(li)<--p p(li(ld))<--q p(ld)<--q p<--top en caso contrario p<--p(ld)hasta p=top
p<--topmensaje(Valor a borrar)lee(valor_a_borrar)repite si p(dato)=valor_a_borrar entonces p(ld(li))<--p(ld) p(li(ld))<--p(li) si p=top entonces si p(ld)=p(li) entoncestop<--nil
en caso contrario top<--top(ld) dispose(p) p<--top en caso contrario p<--p(ld)hasta p=top