Beruflich Dokumente
Kultur Dokumente
LISTAS ENLAZADAS
UNIDAD III Ing. J.A.Cañedo
2
Ing. J.A.Cañedo
Listas enlazadas
• Utiliza posiciones de memoria no contigua para almacenar
los datos.
• Es dinámica, no tiene longitud fija, añade y elimina memoria
cuando lo necesita.
• Se apoya en otros objetos (nodos) para mantener los datos.
• Cada nodo de la lista es un objeto distinto suele haber una
clase nodo separada.
• Una lista enlazada no sabe cuantos datos almacena.
• En una lista enlazada los nodos almacenan la información.
• El orden de los elementos de la lista coincide con el orden de
los nodos en la cadena.
• El primer nodo es la cabeza o inicio de la lista.
3
Ing. J.A.Cañedo
Tipos de listas
• Listas simplemente enlazadas lineal.
• Listas simplemente enlazadas circular
• Listas doblemente enlazadas circular o lineal.
• Listas ortogonales.
4
Ing. J.A.Cañedo
Ing. J.A.Cañedo
6
Ing. J.A.Cañedo
L.S.E.L.
• La lista simplemente enlazada lineal tiene un nodo
muy simple.
• El nodo pertenece a la implementación de la lista
enlazada y no a la interfaz pública de la clase.
• El primer nodo es el inicio o principio de la lista.
• Gráficamente una L.S.E.L. seria:
7
Ing. J.A.Cañedo
Representación de un nodo
Un nodo esta compuesto por dos partes principales
las cuales son el campo dato y el campo referencia
al siguiente nodo de la lista
class Nodo {
int dato;
Nodo liga;
public Nodo()
{ sig
Dato
dato=0;
sig=null;
}
public Nodo (int elem)
{
dato = elem;
sig = null;
}
}
8
Ing. J.A.Cañedo
Creación de un nodo.
La creación del nodo en C# lo hacemos al
momento de invocar al constructor de la clase
public Nodo (int elem)
{
dato = elem;
sig= null;
}
De la manera siguiente
q=new Nodo(dato);
9
Ing. J.A.Cañedo
Implementación.
inicio final
10
Ing. J.A.Cañedo
Crear un L.S.E.L.
Para crear la lista se puede hacer que las inserciones se han por donde
esta posicionado el apuntador inicio en la lista como se muestra a
continuación:
Ing. J.A.Cañedo
Ing. J.A.Cañedo
Ing. J.A.Cañedo
P
inicio final
1 2 4 5 7
Q
14
Ing. J.A.Cañedo
Algoritmo de eliminación
Procedimiento eliminar(info)
sw <- false
si inicio != null entonces
p <- inicio
mientras p!=null haz
si p(dato) = info entonces
sw <- true
si p = inicio entonces
inicio<- inicio(liga)
en caso contrario
si p=final entonces
final=q;
q(liga) <- p(liga)
p(liga) <- null
p <- null
en caso contrario
q <- p
p <- p(liga)
en caso contrario
mensaje( 'no hay lista')
si not sw entonces
mensaje('no existe información')
en caso contrario
mensaje('información borrada')
15
Ing. J.A.Cañedo
inicio
1 2 3 5 4 8
Ing. J.A.Cañedo
Continuacion
A continuación se describe el algoritmo que realiza
dicha operación.
Ing. J.A.Cañedo
Ing. J.A.Cañedo
19
Ing. J.A.Cañedo
Descripción.
Las listas circulares se desprenden de las listas descritas
anteriormente, con respecto al manejo y a su creación son
casi iguales.
Una lista circular tiene la característica que su último
nodo tiene la dirección del primer nodo de la lista, a
diferencia de la lista lineal, en donde el último nodo de la
lista apunta a null. Gráficamente una lista circular se puede
representar de la siguiente manera:
inicio
1 2 3 5 8
20
Ing. J.A.Cañedo
Ing. J.A.Cañedo
lis.Inicio = lis.ult = q;
else
{
lis.ult.liga= q;
lis.ult = q;
}
q.sig = lis.Inicio;
}
22
después de x dato. public void InsertarDespues(ref ListaCirc Lis, int X, int dato)
{
inicio 6
Nodo p = null, q = null;
1 2 3 5 8 if (Lis.Inicio != null)
{
p = Lis.Inicio;
Se desea insertar el nodo con el dato 6 do
{
que se encuentra con líneas azules en if (p.dato == X)
la lista después del nodo cuya {
información es 3, el algoritmo seria: q = new Nodo(dato);
q.liga = p.liga;
p.liga = q;
if (p == Lis.ult)
Lis.ult = p;
p = Lis.Inicio;
}
else
p = p.liga;
} while (p != Lis.Inicio);
}
else
MessageBox.Show("No existe lista circular");
}
23
de x dato en L.C. public void InsertarAntes(ref ListaCirc Lis, int X, int dato)
{
Nodo p = null, q = null, r = null;
if (Lis.Inicio != null)
{
p = Lis.Inicio;
Otra situación diferente a la anterior, do
{
es la de insertar el nodo antes del if (p.dato == X)
nodo cuya información es 3, como se {
q = new Nodo(dato);
muestra a continuación: q.liga = p;
if (p == Lis.Inicio)
{
Lis.Inicio = q;
Lis.ult.liga = Lis.Inicio;
p.liga = q;
6 }
inicio ult else
r.liga = q;
p = Lis.Inicio;
1 3 5 }
else
{
r = p;
p = p.liga;
}
} while (p != Lis.Inicio);
}
}
24
Ing. J.A.Cañedo
Ing. J.A.Cañedo
Procedimiento eliminar(entero x)
El algoritmo que realiza la si inicio != null entonces
tarea de eliminar el nodo con x p <- inicio;
sw <- false
datos seria: haz
si p(dato) = x entonces
sw <- verdadero
si p = inicio entonces
si inicio(liga) = inicio entonces
inicio<- nil
en caso contrario
ult(liga) <- inicio(liga)
inicio<- inicio(liga)
en caso contrario
q(liga) <- p(liga)
si ult=p entonces
ult=q
p->liga <- null
p <- inicio
en caso contrario
q <- p
p <- p(liga)
mientras p != inicio
si sw entonces
mensaje(´nodo borrado´)
en caso contrario
mensaje(´no existe información ´)
en caso contrario
mensaje(´no existe lista´)
26
Ing. J.A.Cañedo
Ing. J.A.Cañedo
Ing. J.A.Cañedo
29
Ing. J.A.Cañedo
Descripción.
Las listas doblemente encadenadas, tienen las característica
de que dado un apuntador p posicionado en cualquier nodo
que forme parte de la lista, esta puede ser examinada en
ambos sentidos, esto es de adelante hacia atrás y de atrás
hacia adelante.
Un nodo en una lista doblemente encadenada tiene dos
apuntadores, uno hacia el nodo siguiente y otro hacia el
nodo anterior, como lo podemos apreciar a continuación:
der
izq B
30
Ing. J.A.Cañedo
Tipos de L.D.E.
Existen dos tipos de lista doblemente encadenadas
las cuales son :
• Circulares
A B C
• Lineales.
A B C
31
Ing. J.A.Cañedo
Ing. J.A.Cañedo
Ing. J.A.Cañedo
Ing. J.A.Cañedo
Ing. J.A.Cañedo
Ing. J.A.Cañedo
37
Ing. J.A.Cañedo
Descripción.
Las listas ortogonales son estructuras que se emplean en el
área de ingeniería donde se manejan matrices demasiado
grandes. Al trabajar con este tipo de estructuras, estamos
hablando de una gran cantidad de elementos, donde dichos
elementos se pueden crear, modificar e incluso destruir
cuando lo desee, lo que no sucede con los arreglos ya que
estos son estáticos esto es que durante toda la ejecución del
programa serán siempre del mismo tamaño, teniendo como
consecuencia un desperdicio de memoria, si la totalidad de
los elementos del arreglo no fueron utilizados, o en el caso
contrario de que se requiere más elementos de los que tiene
declarados. Es por eso de que surgen las listas ortogonales
en donde se puede manejar la longitud de la matriz.
38
Ing. J.A.Cañedo
der
dato
izq
aba
39
Ing. J.A.Cañedo
* * *
Nodos de
encabezamientos
* 2 3 4
* 1 5 7
* 9 2 6
40