Sei sulla pagina 1di 40

LISTAS ENLAZADAS

Las listas enlazadas igual que los arreglos y filas son


estructuras lineales, es decir están dispuestos en forma
lineal uno después del otro, pero se diferencian en que son
estructuras dinámicas y abstractas, es decir pueden variar
de longitud y pueden representarse sobre otra estructura.
Una lista se utiliza cuando se quiere almacenar una
cantidad de datos no conocida y variable. Por ejemplo, en
un editor de textos se pueden escribir secuencias de
longitud muy variable, pueden eliminarse e insertarse
elementos fácilmente.
LISTAS ENLAZADAS

Una lista es una secuencia de elementos de la forma A1,


A2, ..., An. La longitud de la lista es el número de
elementos que contiene la lista. La lista con cero
elementos es llamada lista vacía o nula. Para cualquier
lista excepto la nula, se dice que Ai+1 es sucesor de Ai y
que Ai es predecesor de Ai+1 para i ≥ 1.
La lista enlazada consta de una serie de registros que no
necesariamente son adyacentes en memoria. Cada registro
tiene el elemento y un apuntador a un registro que
contiene su sucesor
Valor Apuntador
LISTAS ENLAZADAS

La lista se define por su posición lógica ordenada, esto es,


cada uno de sus elementos ocupa un espacio que no es
contiguo físicamente pero que están enlazados en forma
lógica a través de apuntadores.
Todo elemento de la lista excepto el último tiene un
sucesor que se encuentra en una dirección de memoria no
necesariamente contigua. De igual forma cada elemento
excepto el primero tiene un antecesor.
La lista se define como un conjunto de direcciones y un
conjunto de nodos asociados mediante una función L.
LISTAS ENLAZADAS

El acceso a una lista es secuencial como en las filas,


siendo el tiempo de acceso a cualquier elemento
proporcional al tamaño de la lista.
En una lista puede hacerse inserciones y eliminaciones en
cualquier posición. El tiempo de inserción o eliminación
en la posición k es independiente del valor de k (es
independiente de la longitud de la lista). Esto contrasta
con los arreglos en el que el tiempo de eliminación e
inserción es proporcional a la longitud del arreglo.
LISTAS ENLAZADAS

DEFINICION
Matemáticamente una lista es una secuencia de cero o más
elementos de un tipo determinado
Sea D un conjunto finito de direcciones
Sea V un conjunto finito de valores
Existe una función L: D  V / L(di) = (vi , di+1)
di dirección del nodo i
vi valor del nodo i
di+1 dirección del nodo i+1 (sucesor del nodo i)

*
LISTAS ENLAZADAS

Todo nodo excepto el primero tiene un nodo antecesor


 i>1  di-1 / L(di) = (vi , di+1)
L(di-1) = (vi-1 , di) nodo antecesor
Para i = 1 ∄ di-1 / L(di) = (vi , di+1) primer nodo
L(di-1) = (vi-1 , di)
Todo nodo excepto el último tiene un nodo sucesor
 i<n  di+1 / L(di) = (vi , di+1)
L(di+1) = (vi+1 , di+2) nodo sucesor
Para i = n ∄ di+1 / L(di) = (vi , di+1) último nodo
L(di) = (vi, *)
LISTAS ENLAZADAS
Representación de listas enlazadas
Mediante arreglos
Mediante arreglos de punteros (cursores)
Mediante apuntadores
Representación mediante arreglos
Los elementos se almacenan en forma contigua en un
arreglo. Para representar listas enlazadas mediante arreglos,
se utilizan índices en lugar de apuntadores.
Para la adición basta con adicionar un elemento después del
último elemento de la lista en el arreglo.
Como desventajas: El espacio de direcciones está limitado
al espacio del arreglo. La inserción y la eliminación implica
realizar desplazamientos de los elementos en el arreglo.
LISTAS ENLAZADAS

Representación mediante arreglos de punteros


(cursores)
El espacio de direcciones se limita al intervalo [1, N]
correspondiente a los índices del arreglo. Consideremos dos
arreglos VALOR y SIG que contienen respectivamente el
valor y la dirección del siguiente elemento a la posición i
del arreglo. El arreglo VALOR corresponde al espacio de
direcciones. Cuando queramos utilizar un espacio,
utilizaremos una celda disponible del vector. Cuando
terminemos de usar un espacio, debemos liberar el espacio
indicándolo como disponible.
LISTAS ENLAZADAS
Representación mediante arreglos de punteros
(cursores)
En forma física estamos trabajando con dos vectores. Sin
embargo en forma lógica estamos trabajando con nodos, en
donde cada nodo se referencia por un índice i ( que puede
considerarse como la dirección di ). La parte valor del nodo
corresponde a VALOR [i] (que puede considerarse como
divalor) y la parte apuntador al siguiente nodo
corresponde a SIG [i] (que puede considerarse como
disig).
Los nodos disponibles están enlazados en una lista con
cabeza DISP (el valor inicial de DISP es 1). Una lista es
vacía o nula si CAB = 0.
LISTAS ENLAZADAS
Representación mediante arreglos de punteros (cursores)
Ejemplo: DISP = 6, CAB = 5 Lista: a, t, u, x
VALOR SIG

1 t 4
2 3
3 7
4 u 8
5 a 1
6 2
7 9
8 x 0
9 0
LISTAS ENLAZADAS)

Representación mediante apuntadores


La representación con arreglos o arreglos de punteros puede
desperdiciar espacio pues utiliza el máximo espacio
disponible, independientemente del número de elementos
de la lista.
La representación con apuntadores, utiliza estrictamente el
espacio necesario para los elementos que tiene actualmente
la lista, pero requiere espacio adicional para los
apuntadores.

*
LISTAS ENLAZADAS
Operaciones sobre listas
Adición implica adicionar un nodo al final de la lista
Recorrido implica recorrer cada elemento de la lista
una única vez
Búsqueda implica la localización de un elemento
determinado, a partir de un valor o posición
Inserción implica añadir un elemento en alguna posición
determinada
Eliminación implica eliminar un elemento de una posición
determinada
Ordenación implica clasificar los elementos de acuerdo
a un orden lógico determinado
Mezcla implica intercalar dos listas ordenadas en
una tercera lista que también lo está
LISTAS ENLAZADAS
1. Adicionar un nodo al final de la lista

CAB apunta al primer elemento de la lista


Val valor a insertar
U apunta al último elemento adicionado
En un inicio cuando la lista esta vacía tanto CAB como U
valen NULL (* o NULO)
Cuando se adiciona el primer nodo CAB = U es igual a la
dirección del primer y único nodo.
Para las demás adiciones, CAB apunta al primer elemento
y U apunta al ultimo elemento. U es utilizado para que
cuando se adicione nuevos elementos sean enlazados al
último nodo U.
LISTAS ENLAZADAS
1. Adicionar un nodo al final de la lista
CAB U

*
Registro Nodo Clase Lista
T valor Nodo *CAB, *U
Nodo *SIG Lista() (CAB = U = NULL)
FinRegistro // otros métodos
FinClase
El predicado Vacío se utiliza para verificar si la lista está vacía o no. La lista
estará vacía cuando la cabecera es nulo, en este caso retorna el valor verdad, en
otro caso retorna el valor falso.
LISTAS ENLAZADAS

Predicado Vacío (cab)


Inicio
Si (cab = Null)
Retornar (verdad)
Sino
Retornar (falso)
FinSi
Fin
LISTAS ENLAZADAS

Acción Adiciona(cab, Val, u)


Inicio
n  nuevo nodo
nvalor  Val
nsig  Null
Si (Vacío(cab))
cab  n
Sino
usig  n
FinSi
un
Fin
LISTAS ENLAZADAS
2. Búsqueda de un elemento

Búsqueda por posición


Sea L una lista con cabecera CAB, se quiere mostrar el
valor que corresponde a la posición Pos (entero > 0). La
acción realiza una exploración secuencial hasta que
encuentra la posición Pos, o hasta que encuentra el final
de la lista cuando no llega a Pos. En el primer caso
muestra el valor encontrado en el nodo de posición Pos, y
en el segundo caso se emite un mensaje de posición no
encontrada.
Acción Acces_Pos(cab, Pos)
Inicio
i1
p  cab
Si (Vacío(cab))
Escribir “lista se encuentra vacía”
Sino
Mientras (i < Pos  p  Null)
p  psig
ii+1
FinMientras
Si (p  Null )
Escribir pvalor
Sino
Escribir “Posición no encontrada”
FinSi
FinSi
Fin
LISTAS ENLAZADAS
2. Búsqueda de un elemento

Búsqueda por valor


Sea una lista con cabecera CAB, se quiere mostrar la
posición en que se encuentra la primera ocurrencia de un
valor Val. La acción realiza una exploración secuencial
hasta que encuentra la primera ocurrencia de Val, o hasta
que encuentra el final de la lista, cuando no lo encuentra.
En el primer caso muestra la dirección en la que se
encontró, y en el segundo caso se emite un mensaje de
valor no encontrado
Acción Acces_Val (cab, Val)
Inicio
encontro  falso
Si (Vacío(cab))
Escribir “lista se encuentra vacía”
Sino
p  cab
Si (pvalor = Val)
encontro  verdad
Sino
Mientras (p  Null  pvalor  Val)
p  psig
FinMientras
Si (p  Null)
encontro  verdad
FinSi
FinSi
Si (encontro) Escribir “Valor encontrado en dirección“, p
Sino Escribir “Valor no encontrado”
FinSi
FinSi
Fin
LISTAS ENLAZADAS
3. Inserción
Cuando se inserta un nuevo nodo a una lista, será
necesario modificar la dirección que aparece en el nodo
que precede al nodo insertado en correspondencia con
ésta y escribir la dirección del nodo siguiente en el
nodo adicionado. Para hallar el nodo que precede al
nodo nuevo será necesario seguir los punteros desde la
cabecera de la lista.

Nodo insertado
LISTAS ENLAZADAS
Inserción por posición
Sea L una lista con cabecera CAB, se quiere insertar un
nodo en la posición Pos (entero > 0). El algoritmo
realiza una exploración secuencial hasta que encuentra
la posición Pos, o hasta que encuentra el final de la
lista, cuando no llega a Pos.
Acción Insertar_Por_Posición (cab, Pos, V)
Inicio
n1  cab
n  nuevo nodo
nvalor  V
Si (Pos = 1)
nsig  cab
cab  n
Sino
i1
Mientras (n1  Null  i < Pos)
ant  n1
n1  n1sig
ii+1
FinMientras
Si (n1  Null )
nsig  antsig
antsig  n
Sino Escribir “Posición no encontrada”
FinSi
FinSi
Fin
LISTAS ENLAZADAS
4. Eliminación
Cuando se quiere eliminar un nodo, el nodo anterior
debe apuntar al sucesor del nodo eliminado. Se explora
secuencialmente la lista desde el inicio guardando la
dirección del nodo anterior cada vez que se avanza una
posición. Cuando se llega al nodo a eliminar, el nodo
anterior al eliminado se cambia con la dirección del
sucesor.
Nodo eliminado
LISTAS ENLAZADAS
Eliminación por Posición
Sea L una lista con cabecera CAB se quiere eliminar el
nodo que corresponde a la posición Pos (entero > 0). El
algoritmo realiza una exploración secuencial hasta que
encuentra la posición Pos y devuelve en V el valor
eliminado, o hasta que encuentra el final de la lista,
cuando no llega a Pos emitiendo un mensaje de Posición
no encontrada.
Acción Eliminar_Por_Posición (cab, Pos, V)
Inicio n  cab
Si (Vacío(cab) )
Escribir “Lista vacía”
Sino
Si (Pos = 1)
V  cabvalor
cab  cabsig
Sino
i1
Mientras (n  Null  i < Pos)
ant  n
n  nsig
ii+1
FinMientras
Si (n  Null )
V  nvalor
antsig  nsig
Sino Escribir “Posición no encontrada”
FinSi
FinSi
FinSi
Fin
LISTAS ENLAZADAS
Eliminación por Valor
Sea L una lista con cabecera CAB se quiere eliminar el
nodo que contiene la primera ocurrencia de un valor
Val. El algoritmo realiza una exploración secuencial
hasta que encuentra la primera ocurrencia de Val, o
hasta que encuentra el final de la lista, cuando no lo
encuentra. En el primer caso elimina el nodo de la
posición encontrada, y en el segundo caso se emite un
mensaje de valor no encontrado.
Acción Eliminar_Por_Valor (cab, Val )
Inicio n  cab
Si (Vacío(cab))
Escribir “Lista vacía”
Sino
encontro  falso
Mientras (n  Null   encontro)
Si (nvalor = Val)
encontro  verdad
Sino ant  n
n  nsig
FinSi
FinMientras
Si (n = Null )
Escribir “ valor no encontrado”
Sino
Si (cab = n)
cab  nsig
Sino antsig  nsig
FinSi
FinSi
FinSi
Fin
LISTAS ENLAZADAS
5. Salvar la Lista en una Fila
Para pasar los elementos de una lista L a una fila
secuencial se recorre la lista L. Mientras existan
elementos en la lista, se ejecuta el ciclo Mientras que
utiliza la primitiva Poner() para adicionar un elemento a
la fila.
Acción Pasar_Lista_a_Fila(cab, F)
Inicio
n  cab
Si (Vacío(cab))
Escribir “Lista se encuentra vacía”
Sino
Primer(F)
Mientras (n  Null)
V  nvalor
Poner(F, V)
n  nsig
FinMientras
Marcar(F, )
FinSi
Fin
LISTAS ENLAZADAS
6. Recuperar la Lista de la Fila
Para pasar los elementos de una fila secuencial F a una
lista L se recorre la fila F. Mientras existan elementos
en la fila, se ejecuta el ciclo Mientras que llama al
método Adiciona(), el que se encarga de adicionar un
elemento al final de la lista.
Acción Pasar_Fila_a_Lista(F, cab)
Inicio
Primer(F)
Tomar(F, V)
cab = Null
u = Null
Mientras ( Ultimo(F))
Adiciona(cab, V, u)
Tomar(F, V)
FinMientras
Fin
LISTAS DOBLEMENTE ENLAZADAS
Una listas enlazada simple presenta la dificultad para
accesar a un nodo antecesor. La única forma sería
comenzando desde la cabecera y explorar la lista hasta que
lleguemos al nodo. Una solución a este problema es añadir
un apuntador adicional a cada nodo que contenga la
dirección del nodo anterior. El inconveniente en esta
representación es el puntero adicional en cada nodo.
Valor
del Apuntador al
nodo nodo sucesor

Apuntador al
nodo anterior
LISTAS DOBLEMENTE ENLAZADAS
Inserción y Eliminación en una lista doblemente
enlazada
La inserción y eliminación en una lista doblemente
enlazada es más fácil de implementar. Conociendo la
dirección de un nodo, se puede obtener la dirección de los
nodos adyacentes.
LISTAS DOBLEMENTE ENLAZADAS
Inserción
Para insertar un nodo después del nodo con dirección D,
se tiene que solicitar un nuevo nodo y enlazarlo con el
nodo D y el nodo siguiente a D.

Nodo insertado
LISTAS DOBLEMENTE ENLAZADAS

Acción Insertar(V,D)
Inicio
N  nuevo nodo
N  valor  V
N  PS  D  PS
(D  PS)  PA N
N  PA  D
D  PS  N
Fin
LISTAS DOBLEMENTE ENLAZADAS
Eliminación
Para eliminar el nodo con dirección D, se realiza un
proceso similar de reacomodamiento de los punteros de
los nodos antecesor y sucesor del nodo D. En V se
almacenará el valor del nodo eliminado.

Nodo eliminado
LISTAS DOBLEMENTE ENLAZADAS

Acción Eliminar (V, D)


Inicio
V  D  Valor
(D  PA)  PS  D  PS
(D  PS)  PA  D  PA
Fin
LISTAS EN ANILLO (CIRCULARES)
Una lista en anillo es una lista enlazada simple o
unidireccional en la que el último nodo apunta al primer
nodo en lugar de contener el puntero nulo, de modo que se
convierte en un anillo.
CAB
LISTAS ENLAZADAS CON CABECERA
Una lista enlazada con cabecera es una lista enlazada que
contiene un nodo especial llamado nodo cabecera, al
principio de la lista. Dicho nodo no representa un elemento
de la lista. El registro de cabecera puede utilizarse para
almacenar información acerca de la lista, como por ejemplo
el número de elementos de la lista.
El puntero CAB siempre apuntará al nodo cabecera.
Tipos de listas enlazadas con cabecera
(1) Lista enlazada simple con cabecera o lista doblemente
enlazada con cabecera es una lista enlazada con cabecera
cuyo ultimo nodo contiene el puntero nulo. Si CAB  sig
= NULL indicará que la lista está vacía.
(2) Lista circular con cabecera es una lista enlazada con
cabecera en la que el último nodo apunta al nodo cabecera.
Si CAB  sig = CAB indicará que la lista está vacía.

Potrebbero piacerti anche