You are on page 1of 14

Listas 4.

1 Fundamentos
Las listas son secuencias de elementos, donde estos elementos pueden ser accedidos, insertados o suprimidos en cualquier posicin de la lista. No existe restriccin alguna acerca de la localizacin de esas operaciones. Se trata de estructuras muy flexibles puesto que pueden crecer o acotarse como se quiera. Matemticamente, una lista es una secuencia de cero o ms elementos de un tipo determinado (que por lo general denominaremos !. " menudo se representa una lista como una sucesin de elementos separados por comas#

a(1), a(2), a(3), ... , a(n) donde a $n$ (n %& '! se le llama longitud de la lista. "l suponer n%&(, se dice que a((! es el primer elemento de la lista y a(n! el )ltimo elemento. Si n&', se tiene una lista *ac+a. ,na propiedad importante de una lista es que sus elementos pueden estar ordenados en forma lineal de acuerdo con sus posiciones en la lista. Se dice que a(i! precede a a(i-(!, para i&(,., .., n/(, y que a(i! sucede a a(i/(!, para i&., 0, .., n. ambi1n se dice que el elemento a(i! est en la posicin i de la lista. 2or lo que se *e, las estructuras pila y cola, estudiadas en el cap+tulo anterior, no son ms que casos particulares de la estructura lista generalizada. "l igual que en los casos anteriores, se puede pensar en representar una lista mediante un array unidimensional, lo que permite un acceso eficiente a cada uno de los componentes de la estructura, lo que, en principio, parece proporcionar un esquema adecuado para representar las operaciones que normalmente se desean realizar sobre la lista# acceder a un elemento (nodo! arbitrario de la lista, insertar y borrar nodos, etc. Sin embargo, si bien todas estas consideraciones eran ciertas para las pilas y las colas, cuando se trata de otro tipo de listas, las operaciones a realizar sobre el array resultan bastante ms costosas. 2or e3emplo, supongamos la siguiente lista#

(Antonio, Bartolom, Carlos, David, Emilio, Germn, Jaime, Jos, Luis, anuel) Si se desea a4adir el *alor 56ernando5 a esta lista ordenada de nombres, la operacin se debe realizar en la sexta posicin de la lista, entre los *alores 57milio5 y 58ermn5. 9uando la lista est representada con un array, dic:a insercin implicar tener que desplazar una posicin :acia la derec:a todos los elementos situados ya en la lista a partir de la posicin seis (8ermn,...Manuel!, para de esta forma de3ar una posicin libre en el array y poder insertar all+ el nue*o *alor. 2or otro lado, si suponemos que lo que se desea es borrar de la lista el elemento 59arlos5, de nue*o es necesario desplazar elementos para mantener la estructura secuencial de la lista. 7n este caso es preciso mo*er una posicin :acia la izquierda todos los elementos situados a partir de la cuarta posicin. 9uando el problema es manipular diferentes listas de tama4o *ariable, la representacin secuencial prueba ser, de nue*o, poco apropiada. Si se decide almacenar en distintos arrays cada una de las listas, se tendrn grandes necesidades de almacenamiento. Si, por el contrario, se toma la decisin de usar un )nico array, se necesitar una cantidad muc:o mayor de desplazamientos de informacin. ,na solucin elegante al problema del desplazamiento de informacin en el almacenamiento secuencial se logra mediante la utilizacin de representaciones enlazadas (o ligadas!. " diferencia de la representacin secuencial, en la representacin enlazada los

elementos se pueden situar en cualquier posicin de memoria, y no necesariamente igualmente distantes dentro de ella. ambi1n se puede decir que, si bien en la representacin con arrays el orden de los elementos es el mismo que el orden en la lista, en una representacin enlazada la secuencia de orden de la lista no tiene porque coincidir con la secuencia de almacenamiento en memoria.

4.2 Listas enlazadas


9uando se utilizan representaciones enlazadas para listas, se est rompiendo la asociacin que exist+a entre la secuencia lgica establecida en la estructura de datos y la secuencia f+sica que representaba esa lista en un array. ":ora, los elementos de la lista pueden estar en zonas de memoria no necesariamente contiguas, lo que tiene como *enta3a que cuando se desee insertar un elemento nue*o, no :ay que :acerlo en una posicin concreta de la memoria y que, por lo tanto, no :ay que desplazar elementos. Lo mismo ocurrir con la operacin de borrado, para eliminar un elemento bastar con aislarlo de la secuencia de orden que sigue la lista, sin que por ello sea necesario mo*er ning)n elemento. 7l almacenamiento no secuencial de la informacin implica que para acceder a los nodos de la lista en el orden correcto, es necesario almacenar 3unto a la informacin propia de cada elemento la localizacin o direccin del siguiente elemento de la lista, 2or e3emplo, supongamos que la anterior lista ordenada de nombres se almacena de forma no secuencial en la memoria, entonces su esquema de almacenamiento ser+a anlogo al mostrado por la siguiente figura, donde se asocia la estructura de la memoria con la de un array unidimensional.

1 !! Antonio " 2 !! 3 !! Carlos # !! David % !! & !! $ !! Emilio ' !! " !! Bartolom ... ...

# $

1% 3 ...

9ada elemento de la lista contiene un campo informacin (nombre! ms otro campo que indica en qu1 posicin de memoria se encuentra el siguiente elemento de la lista. "s+, por e3emplo, el primer elemento de la lista ("ntonio! reside en este caso en la posicin (, el segundo (;artolom1! en la <, el tercero (9arlos! en la 0, y as+ sucesi*amente. 7n un lengua3e de programacin, para almacenar la informacin sobre direcciones de *ariables se dispone :abitualmente del tipo de datos puntero. 7ntonces, asociado a la representacin de la informacin de cada nodo :ay que a4adir un campo de tipo puntero que permita ir enlazando correctamente todos los nodos de la lista. 7sto quiere decir que un elemento de la lista tendr ms de un campo de informacin, como m+nimo dos, donde uno (o *arios! de ellos representan informacin que se desea almacenar en la estructura (la *erdaderamente rele*ante para el problema concreto! y otro(s! permite enlazar cada nodo de la lista con otro del mismo tipo. 8racias a la utilizacin de punteros es posible e*itar la relacin expl+cita con las direcciones de memoria. Se traba3a siempre con referencias a elementos no con direcciones espec+ficas, ya que cada *ez que se e3ecute el programa la localizacin real de cada nodo puede cambiar.

7n una representacin enlazada, las estructuras de datos se crean por insercin de nue*os elementos, en este caso no existe un espacio reser*ado globalmente para toda la estructura. 7ntonces, la insercin de un elemento implica realmente que el espacio reser*ado para la estructura aumenta, y que cuando se suprime un nodo, el espacio reser*ado disminuye. 2or esa razn, este tipo de representaciones reciben el nombre de estructuras dinmicas, porque su tama4o cambia durante la e3ecucin del programa adecundose a las necesidades del problema. =eamos con un e3emplo concreto cmo la representacin enlazada de una lista puede facilitar, por e3emplo, la operacin de insercin. =ol*amos a considerar el primer e3emplo tratado en este tema, una lista ordenada de nombres#

(Antonio, Bartolom, Carlos, David, Emilio, Germn, Jaime, Jos, Luis, anuel) donde se desea insertar el nombre 56ernando5. Su posicin correcta dentro de la lista es entre 57milio5 y 58ermn5. 7ntonces, para insertar el nue*o elemento es necesario realizar los siguientes pasos# ((! >eser*ar espacio para almacenar un nue*o nodo de la lista, sea su localizacin x. (.! ?ntroducir en el campo de informacin del nue*o nodo el *alor 56ernando5. (0! @acer que el campo de enlace del nue*o nodo apunte al nodo cuya informacin es 8ermn. (A! @acer que el campo de enlace del nodo cuya informacin es 57milio5 apunte a x. Lo importante es que ya no es necesario mo*er elementos para insertar un nue*o nodo. Se :a sol*entado la necesidad de mo*er informacin a expensas de reser*ar ms espacio en memoria para cada nodo, solamente para almacenar una direccin de memoria, lo cual, en general, resulta ms con*eniente. 2or lo tanto, para :acer posible la representacin enlazada de una estructura de datos es necesario poseer#

/ ,n mecanismo para definir la estructura de un nodo. / ,n m1todo para crear nodos cuando se necesiten. / ,n m1todo para liberar el espacio de un nodo cuando ya no sea necesario.

odas estas capacidades suelen estar disponibles en un lengua3e de alto ni*el, como por e3emplo 2ascal o 9. Mediante los mecanismos de declaracin de tipos de datos, es posible definir la estructura de un nodo y con los procedimientos de manipulacin de datos de tipo puntero es posible crear nue*os nodos (procedimiento 5neB5! y liberar los borrados (procedimiento 5dispose5!. ,n e3emplo de declaracin en 2ascal que permite definir el nodo de una lista general podr+a ser el siguiente#

()*e +alor , -(. in/orma0i1n de 0ada nodo .) (i*o2untero , 3(i*o4odo5 (i*o4odo , re0ord in/orma0ion6 +alor5 enla0e6 (i*o2untero5 end5 Lista , re0ord ini0io6 (i*o2untero5

end5 +ar l6 Lista5

7n este e3emplo, en el campo 5informacion5 se almacenar la informacin de inter1s asociada con los elementos de la lista (de :ec:o este campo puede ser, a su *ez, un registro!, que es independiente de la estructura de datos, mientras que el campo 5enlace5 es una referencia al siguiente elemento en la secuencia establecida en la lista. Siguiendo con el lengua3e 2ascal, la creacin de un nue*o nodo implica simplemente :acer una llamada al procedimiento 5neB5, pasndole como parmetro una *ariable del tipo 5 ipo2untero5. 7l procedimiento busca un espacio libre en memoria donde almacenar un nodo, cuando lo encuentra le asigna la direccin de inicio del bloque reser*ado a la *ariable que se :a pasado como parmetro, lo que permite el acceso al nodo. Si por el contrario, lo que se desea es liberar el espacio ocupado por un nodo que se :a eliminado de la lista, basta con :acer una llamada al procedimiento 5dispose5, pasando como parmetro el puntero que daba acceso a dic:o nodo. 2ara familiarizarnos con la manipulacin de estructuras enlazadas, *amos a empezar por *er la representacin enlazada de un par de estructuras de datos bien conocidas, las pilas y las colas, para despu1s generalizar los mecanismos de manipulacin a la estructura lista.

4.3 Pilas y colas enlazadas


Se :a *isto ya cmo representar pilas y colas de manera secuencial. 7se tipo de representacin prueba ser bastante eficiente, sobretodo cuando se tiene slo una pila o una cola. 9uando sobre el mismo array se tiene que representar ms de una estructura, entonces aparecen problemas para poder apro*ec:ar de manera eficiente toda la memoria disponible. =amos a presentar en esta seccin una nue*a representacin de las pilas y las colas mediante la estructura de lista enlazada. 7n la representacin de estas estructuras *amos a :acer que los enlaces entre los elementos de la misma sea tal que faciliten las operaciones de insercin y borrado de elementos. "dems, :ay que tener en cuenta que, como en cualquier otro tipo de representacin, es necesario mantener *ariables que indiquen dnde estn los extremos de las estructuras (dnde se realizan las operaciones!, pero en este caso dic:as *ariables ya no pueden ser +ndices de un array sino referencias a localizaciones de elementos, es decir, punteros.

Pilas enlazadas
9omenzando por la estructura pila, enlazando los elementos con punteros las operaciones de insercin y borrado resultan muy simples. " continuacin definiremos la estructura pila con esta nue*a representacin.

Crear pila:
Ceclaramos los tipos de datos necesarios para representar un nodo e inicializamos la pila como *acia. ((! Ceclaraciones# 4odo7*ila6 re8istro (in/orma0ion6 (, enla0e6 *untero a 4odo7*ila) 0ima6 *untero a 4odo7*ila (2)Asi8na0i1n de *ila va09a

0ima :!! 4;L<

Comprobar si la pila est vaca:


La pila estar *ac+a si y solamente si el puntero cima no :ace referencia a ninguna direccin de memoria. si 0ima , 4;L< enton0es devolver(0ierto) sino devolver(/also)

cceder al elemento situado en la cima:


"l elemento $*isible$ de la pila se puede acceder fcilmente a tra*1s del puntero que le referencia, cima, que siempre debe existir y ser adecuadamente actualizado.

!peraci"n de inserci"n:
9on la representacin enlazada de la pila, la estructura tiene una menor limitacin en cuanto al posible n)mero de elementos que se pueden almacenar simultneamente. @ay que tener en cuenta que la representacin de la pila ya no requiere la especificacin de un tama4o mximo, por lo que mientras exista memoria disponible se *a a poder reser*ar espacio para nue*os elementos. 2or esa razn, se *a a suponer en el siguiente algoritmo que la condicin de pila llena no se *a a dar y, por lo tanto, no ser necesaria su comprobacin.

l#oritmo

pilar
Entrada =6 ( (. elemento >ue se desea insertar .) ?ni0io * :!! 0rear7es*a0io *3.in/orma0ion :!! = *3.enla0e :!! 0ima 0ima :!! * @in

9omo se puede obser*ar el algoritmo de insercin utilizando esta nue*a representacin continua siendo muy simple, siendo el coste del mismo constante (cuatro pasos!.

!peraci"n de eliminaci"n:
Lo )nico que :ay que tener en cuenta a la :ora de dise4ar un algoritmo para esta operacin es la utilizacin eficiente de la memoria, de forma que el espacio ocupado por el nodo borrado *uel*a a estar disponible para el sistema.

l#oritmo $esapilar
Aalida =6 ( +ariaBle *6 *untero a 4odo7*ila

?ni0io si 2ila7va0ia enton0es CError6 *ila va0iaC sino * :!! 0ima = :!! *3.in/orma0ion 0ima :!! *3.enla0e liBerar7es*a0io(*) /in7sino @in

La solucin dada se puede extender a $m$ pilas, de :ec:o como los enlaces entre elementos son establecidos por el programador, no por el m1todo de representacin, es como si las pilas siempre compartiesen espacios diferentes, no interfieren unas con otras. Se trata de una solucin conceptual y computacionalmente simple. No existe necesidad de desplazar unas pilas para proporcionar ms espacio a otras. 7l incremento de espacio de almacenamiento que implica la representacin enlazada se *e compensada por la capacidad de representacin de listas comple3as de una forma simple y por la disminucin del tiempo de cmputo asociado a la manipulacin de listas, respecto a la representacin secuencial.

Colas enlazadas
"nlogamente al desarrollo :ec:o para las pilas se puede pasar a definir las operaciones requeridas para especificar una cola de forma enlazada.

Crear cola:
Ceclaramos los tipos de datos necesarios para representar un nodo e inicializamos la cola como *acia. ((! Ceclaraciones# 4odo70ola6 re8istro (in/orma0ion6 (, enla0e6 *untero a 4odo70ola) ini0io, /inal6 *untero a 4odo70ola (2)Asi8na0i1n de 0ola va09a ini0io :!! 4;L< /inal :!! 4;L<

Comprobar si la cola est vaca:


Ce nue*o, la estructura estar *ac+a si y slo si el puntero inicio no :ace referencia a ning)n nodo de la cola. si ini0io , 4;L< enton0es devolver(0ierto) sino devolver(/also)

cceso al primer elemento de la cola:


Se puede acceder a este elemento de la cola mediante el puntero inicio que lo referencia.

!peraci"n de inserci"n: l#oritmo %nsertarCola

Entrada =6 ( +ariaBle *6 *untero a 4odo70ola ?ni0io * :!! 0rear7es*a0io *3.in/orma0ion :!! = *3.enla0e :!! nulo si Cola7va0ia enton0es ini0io :!! * sino /inal3.enla0e :!! * /inal :!! * @in

!peraci"n de borrado: l#oritmo &orrarCola


Aalida =6 ( +ariaBle *6 *untero a 4odo70ola ?ni0io si Cola7va0ia enton0es CError6 0ola va0ia.C sino * :!! ini0io ini0io :!! *3.enla0e (. si tras Borrar se va0ia la 0ola, Da) >ue *oner /inal a nulo .) si Cola7va0ia enton0es /inal :!! 4;L< = :!! *3.in/orma0ion liBerar7es*a0io(*) /in7sino @in

4.4 !peraciones sobre listas enlazadas


,na *ez *ista la representacin de las operaciones de manipulacin de pilas y colas cuando se representan con estructuras enlazadas, pasemos a estudiar las operaciones de manipulacin sobre las listas generalizadas. 7n este caso, las operaciones que definen la estructura de datos son#

9rear una lista *ac+a. Ceterminar si la lista est *ac+a. "cceder a un nodo cualquiera de la lista.

?nsertar un nue*o nodo en cualquier posicin. ;orrar un nodo en cualquier posicin.

Da :emos *isto anteriormente la declaracin general de tipos para un nodo de la lista en 2ascal, es fcil transformar 1sta a cualquier otro lengua3e de programacin que nos interese. 2asemos directamente a la definicin de las operaciones enumeradas. 7s importante tener en cuenta que es necesario declarar una *ariable que permita acceder en todo momento a la estructura a tra*1s del primer elemento de la lista, para a partir de 1l poder recorrer toda la estructura. Llamaremos inicio a dic:a *ariable, concr1tamente al )nico campo de esa *ariable.

l#oritmo %niciarLista
Entrada l6 Lista ?ni0io l.ini0io :!! 4;L< @in

l#oritmo Lista'acia
Entrada l6 Lista Aalida (0ierto, /also) ?ni0io si (l.ini0io , 4;L<) enton0es devolver(0ierto) sino devolver(/also) @in

cceso a un nodo de la lista:


La posicin de un nodo en la lista siempre *endr dada por su direccin, es decir, por una *ariable de tipo puntero. 2or tanto, el acceso a la informacin de ese nodo siempre se :ar mediante ese puntero. 9uando la posicin del nodo no es conocida es necesario realizar un proceso de b)squeda para localizar el nodo deseado, normalmente en funcin de la informacin que contiene. Lo normal es localizar el nodo que contiene una informacin determinada, esto requiere de una busqueda secuencial pura.

l#oritmo Localizar
Entradas l6 Lista =6 +alor lo0aliEar .) (. in/orma0i1n >ue se desea

Aalida *6 *untero a nodo Bus0ado .) +ariaBles *6 *untero a nodo ?ni0io * :!! l.ini0io mientras (* :F 4;L<) ) (*3.in/orma0ion :F =) Da0er * :!! *3.enla0e devolver(*) (. si * , 4;L<, enton0es no se Da en0ontrado un nodo 0u)a in/orma0i1n sea = .) @in (. dire00i1n del nodo

La condicin de b)squeda puede cambiar ligeramente pero la estructura del algoritmo se mantiene :abitualmente intacta# buscar secuencialmente :asta que se cumpla la condicin impuesta o se alcance el final de la lista. 7l proceso de b)squeda, tal como se :a planteado resultar+a adecuado para aplicar la estrategia del centinela que ya :emos comentado en *arias ocasiones.

%nsertar un nuevo nodo en cual(uier posici"n:


La insercin de un nue*o nodo en la lista debe *enir determinada por su localizacin final en la misma. 7s necesario la indicacin pre*ia sobre dnde debe ubicarse el nue*o nodo. =amos a considerar dos posibilidades, que dada una posicin dentro de la lista el nue*o nodo se inserte detrs de esa posicin o que, por el contrario, se inserte delante de esa posicin. 7so da lugar a dos algoritmos#

l#oritmo %nsertar$etras
Entradas l6 Lista donde6 *untero a nodo =6 +alor (. in/orma0i1n >ue vamos a insertar .) +ariaBles *6 *untero a nodo ?ni0io 0rear7es*a0io(*) *3.in/orma0ion :!! = si Lista+a0ia enton0es l.ini0io :!! * *3.enla0e :!! 4;L< sino *3.enla0e :!! donde3.enla0e donde3.enla0e :!! *

/in7sino @in

l#oritmo %nsertar$elante
Entradas l6 Lista donde6 *untero a nodo =6 +alor (. in/orma0i1n >ue vamos a insertar .) +ariaBles *6 *untero a nodo ?ni0io 0rear7es*a0io(*) si Lista+a0ia enton0es *3.in/orma0ion :!! = l.ini0io :!! * *3.enla0e :!! 4;L< sino *3 :!! donde3 (. *3.in/orma0ion :!! donde3.in/orma0ion .) (. *3.enla0e :!! donde3.enla0e .) donde3.enla0e :!! * donde3.in/orma0ion :!! = /in7sino @in

La operacin de insercin delante presenta una peque4a dificultad adicional, el sentido de los enlaces dentro de la lista. @ay que tener en cuenta que tal como se :a creado la estructura de la lista, en ella es fcil pasar de un elemento al siguiente dentro de la secuencia, pero no es inmediato pasar al anterior. 2ara ello es necesario *ol*er a recorrer la lista desde el primer elemento :asta alcanzar el deseado. 2or esa razn, en el algoritmo anterior lo que en realidad se :ace es insertar un nodo detrs del apuntado por donde, pero en ese nue*o nodo no se inserta la nue*a informacin sino que se almacena la que finalmente debe quedar detrs (la contenia donde)!, finalmente el *alor x se almacena en la posicin indicada por donde y la informacin queda almacenada en el orden que se deseaba.

&orrar un nodo en cual(uier posici"n:


enemos que diferenciar *arios casos particulares, que el nodo borrado sea el primero de la lista, el )ltimo o el caso general en el que no est1 en ninguno de estos dos lugares.

l#oritmo &orrar*odo
Entradas l6 Lista donde6 *untero a nodo +ariaBles

*6 *untero a nodo ?ni0io si Lista+a0ia enton0es CError6 lista va0iaC sino si (l.ini0io3.enla0e , 4;L<) enton0es liBerar7es*a0io(l.ini0io) l.ini0io , 4;L< sino si (donde3.enla0e , 4;L<) enton0es * :!! l.ini0io mientras (*3.enla0e3.enla0e :F 4;L<) Da0er * :!! *3.enla0e *3.enla0e :!! 4;L< liBerar7es*a0io(donde) sino * :!! donde3.enla0e donde3 :!! *3 liBerar7es*a0io(*) /in7sino /in7sino /in7sino @in

4.+ Listas doblemente enlazadas


@asta a:ora :emos estado traba3ando exclusi*amente con listas simplemente enlazadas. Cependiendo del problema, este tipo de estructura puede resultar ciertamente restricti*a. La dificultad de mane3o de estas listas, como :emos *isto, *iene dada por el :ec:o de que dado un nodo espec+fico, solamente es posible mo*erse dentro de la lista en el sentido del )nico enlace existente para ese nodo, es decir, es fcil pasar al sucesor pero no es igualmente fcil pasar al antecesor de ese mismo nodo. La )nica manera de encontrar el predecesor de un nodo es *ol*er a recorrer la lista desde el principio. 2or lo tanto, cuando se tiene un problema donde es necesario mo*erse en ambos sentidos, es recomendable representar la lista con dos enlaces (doblemente enlazada!. 7n este tipo de representacin, cada nodo tiene dos campos de enlace, uno que enlaza con el nodo predecesor y otro que enlaza con el nodo sucesor. ,n nodo en una lista doblemente enlazada tiene, al menos tres campos, uno o ms de informacin y dos campos de enlace. 7n ocasiones, para facilitar a)n ms los mo*imientos dentro de la lista, es con*eniente recurrir a una estructura circular de la misma, de forma que desde el )ltimo elemento de la lista se pueda pasar al primero y *ice*ersa. 7ntonces se :abla de una lista circular doblemente enlazada. La estructura circular se puede utilizar igualmente aunque la lista sea simplemente enlazada. 2ara facilitar las operaciones de manipulacin de las estructuras circulares, sobre todo la insercin, y e*itar en lo posible la consideracin de casos especiales ( lista vacia! se suele a4adir un nodo inicial (cabeza!, que no contiene ninguna informacin )til, y que existe aunque la lista est1 *ac+a. Ce modo que, incluso la lista *ac+a tiene una estructura circular. ,n e3emplo de declaracin en 2ascal que permite definir el nodo de una lista doblemente enlazada podr+a ser el siguiente#

()*e +alor , -nodo .)

(. in/orma0i1n de 0ada

(i*o2untero , 3(i*o4odo5 (i*o4odo , re0ord in/orma0ion6 +alor5 si8, ant6 (i*o2untero5 end5 Lista , re0ord ini0io6 (i*o2untero5 end5 +ar l6 ListaD5

":ora, si suponemos que p apunta a un nodo en una lista doblemente enlazada y que la estructura de un nodo tiene la forma anterior, entonces se cumple que# * , *3.ant3.si8 , *3.si83.ant

7sta expresin refle3a la principal *irtud de esta estructura, es igualmente simple mo*erse :acia adelante o :acia atrs en la lista. La especificacin completa de estas listas requiere la definicin de las principales operaciones de manipulacin# insercin y borrado, aunque *eremos primero la operacion de determinacin de una lista *acia y su inicializacin.

l#oritmo %niciarLista
Entrada l6 ListaD +ariaBle *6 *untero a nodo ?ni0io 0rear7es*a0io(*) *3.si8 :!! * *3.ant :!! * l.ini0io :!! * @in

La condicin lista *ac+a a:ora implicar comprobar si el sucesor (o el antecesor! de un nodo es igual a si mismo. 7so slo se cumplir cuando cuando el )nico nodo presente en la estructura sea el que :ace el papel de cabeza.

l#oritmo Lista'acia
Entrada l6 ListaD Aalida

(0ierto, /also) ?ni0io si (l.ini0io , l.ini0io3.si8) enton0es devolver(0ierto) sino devolver(/also) @in

=eamos a:ora como quedar+a el algoritmo de insercin sobre una lista circular doblemente enlazada con nodo cabeza. Se considera el caso en el que es necesario insertar el nue*o nodo detrs de un nodo ya existente. ":ora, la insercin delante del nodo resultar+a completamente anloga.

l#oritmo %nsertar$etras
Entrada l6 ListaD donde6 *untero a nodo =6 +alor +ariaBle *6 *untero a nodo ?ni0io 0rear7es*a0io(*) *3.in/orma0ion :!! = *3.si8 :!! donde3.si8 *3.ant :!! donde donde3.si83.ant :!! * donde3.si8 :!! * @in

9abe destacar que no se da ning)n caso especial y todas las inserciones de nodos se realizan de la misma manera, incluso aunque la lista est1 *ac+a.

l#oritmo &orrar*odo
Entrada l6 ListaD donde6 *untero a nodo ?ni0io si Lista+a0ia enton0es CError6 lista va0iaC sino donde3.ant3.si8 :!! donde3.si8 donde3.si83.ant :!! donde3.ant liBerar7es*a0io(donde) /in7sino @in

7l algoritmo para localizar un elemento dentro de la lista doblemente enlazada es similar al de una lista simple sal*o un detalle. "ntes de recorrer la lista, el nodo auxiliar encargado de ello tendr que apuntar a l.inicio).si#, ya que el nodo cabeza no contiene informacin, slo es un formalismo para simplificar las operaciones de manipulacin.

You might also like