Transcript Listas
Estructuras Dinámicas
Cambian de tamaño durante la ejecución del
programa
Es imposible reservar una cantidad fija de espacio
de almacenamiento
La reservación de memoria y asignación de
direcciones se lleva a cabo mediante la
asignación dinámica de almacenamiento
Uso de apuntadores
Estructuras Dinámicas
Están compuestas de pequeñas estructuras llamadas nodos
o elementos, enlazadas mediante uno o más apuntadores a
objetos del mismo tipo nodo
DATO
DATO
DATO
DATO
DATO
Dependiendo del número de apuntadores y de las relaciones
entre nodos podemos distinguir varios tipos de estructuras
dinámicas
Estructuras Dinámicas
LISTAS
GRAFOS
Estructuras Dinámicas
ÁRBOLES
TABLAS DE HASH
.
.
.
.
.
.
Estructuras Dinámicas
LISTAS
Listas simplemente enlazadas
Listas simplemente enlazadas con nodo cabecera
Listas circulares doblemente enlazadas con nodo cabecera
Listas doblemente enlazadas con nodo cabecera
Listas circulares simplemente enlazadas
Listas circulares simplemente enlazadas con nodo cabecera
Listas circulares doblemente enlazadas
Estructuras Dinámicas
OPERACIONES SOBRE LISTAS
• Insertar o añadir un elemento
• Eliminar un elemento
• Localizar un elemento
Estructuras Dinámicas
Listas Simplemente Enlazadas
La estructura más simple
Conjunto de registros o nodos (no necesariamente
adyacentes en memoria)
Cada registro contiene un elemento y un apuntador a un
registro que contiene su sucesor
El apuntador del último registro de la lista contiene el valor nil
Se requiere de un apuntador que referencie o apunte al primer
elemento de la misma (¡nunca debe perderse!)
Estructuras Dinámicas
Listas Simplemente Enlazadas
L
a1
a2
a3
a4
a5
L
458
458
a1
500
500
a2
850
850
a3
350
350
a4
993
933
a5 nil
Estructuras Dinámicas
Listas Simplemente Enlazadas
Lista Vacía
L
L
nil
Estructuras Dinámicas
Listas Simplemente Enlazadas
Declaración
Formal
Tipo
ptr_Nodo = pointer_to_Nodo;
Nodo = Tuple
elemento: Tipo_info;
prox: ptr_Nodo;
end;
Lista = ptr_Nodo;
Estructuras Dinámicas
Listas Simplemente Enlazadas
Inserción
Parámetros: Lista (L) , elemento (e), posición (p)
La posición debe ser válida (1 <= p <= (Long(L) + 1)
Considerar: Inserción en primera posición, al final de la lista,
en lista vacía
Procedimiento:
Crear el nodo con el elemento
Localizar la posición
Actualizar los apuntadores involucrados
Estructuras Dinámicas
Listas Simplemente Enlazadas
Inserción
L
a1
a2
a3
a4
a5
a4
a5
Q
ax
Ant
Act
a2
a3
L
a1
Q
ax
Estructuras Dinámicas
Listas Simplemente Enlazadas
Inserción
Proc Insertar(in-out L: Lista; in pos: integer; in e: Tipo_Info)
Var
Act, Ant, Q: ptr_Nodo; i: integer;
begin
Act L; i 1; Crear(Q);
Q.elemento e;
while (i < pos) do
Ant Act;
Act Act.prox;
i i + 1;
end
if Act = L then
L Q;
else
Ant.prox Q;
end
Q.prox Act;
end
Estructuras Dinámicas
Listas Simplemente Enlazadas
Eliminación
Parámetros: Lista (L) , elemento (e), posición (p)
La posición debe ser válida (1 <= p <= (Long(L))
Considerar: Eliminación en primera posición, al final de la
lista
Procedimiento:
Localizar la posición
Actualizar los apuntadores involucrados
Liberar el espacio ocupado por el nodo
Estructuras Dinámicas
Listas Simplemente Enlazadas
Eliminación
Ant
Act
L
a1
a2
Ant
a3
a4
a5
a4
a5
Act
L
a1
a2
a3
Estructuras Dinámicas
Listas Simplemente Enlazadas
Eliminación
Proc Eliminar (in-out L: Lista; in pos: integer)
Var
Act, Ant: ptr_Nodo;
i: integer;
begin
Act L; i 1;
while (i < pos) do
Ant Act;
Act Act.prox;
i i + 1;
end
if Act = L then
L Act.prox;
else
Ant.prox Act.prox;
end
Liberar(Act);
end
Estructuras Dinámicas
Listas Simplemente Enlazadas con nodo cabecera
El primer nodo de la lista no contiene ningún elemento. La
lista está referenciada por el apuntador contenido en el nodo
cabecera
Por lo general el nodo cabecera es del mismo tipo de los
nodos restantes de la lista a pesar de que este no contiene
ningún elemento de la misma
Estructuras Dinámicas
Listas Simplemente Enlazadas con nodo cabecera
L
nodo cabecera
a1
a2
Lista Vacía
L
nodo cabecera
a3
a4
Estructuras Dinámicas
Listas Simplemente Enlazadas con nodo cabecera
Declaración Formal
Type
ptr_Nodo = pointer_to Nodo;
Nodo = tuple
elemento: Tipo_info;
prox: ptr_Nodo;
end;
Lista = ptr_Nodo;
Estructuras Dinámicas
Listas Simplemente Enlazadas con nodo cabecera
Inserción
Parámetros: Lista (L) , elemento (e), posición (p)
La posición debe ser válida (1 <= p <= (Long(L) + 1)
No es necesario considerar a parte la inserción en la primera
posición ni en una lista vacía
Procedimiento:
Crear el nodo con el elemento
Localizar la posición
Actualizar los apuntadores involucrados
Estructuras Dinámicas
Listas Simplemente Enlazadas con nodo cabecera
Inserción
L
a1
a2
a5
a6
a3
a4
Q
ax
Ant
Act
a1
a2
L
Q
ax
Estructuras Dinámicas
Listas Simplemente Enlazadas con nodo cabecera
Inserción
Proc Insertar (in-out L: Lista; in pos: integer; in e: Tipo_Info)
Var
Act, Ant, Q: ptr_Nodo;
i: integer;
begin
Act L; i 1;
Crear(Q);
Q.elemento e;
while (i < pos) do
Ant Act;
Act Act.prox;
i i + 1;
end
Ant.prox Q;
Q.prox Act;
end
Estructuras Dinámicas
Listas Simplemente Enlazadas con nodo cabecera
Eliminación
Parámetros: Lista (L) , elemento (e), posición (p)
La posición debe ser válida (1 <= p <= (Long(L))
No es necesario considerar a parte la eliminación del primer
elemento de la lista
Procedimiento:
Localizar la posición
Actualizar los apuntadores involucrados
Liberar el espacio ocupado por el nodo
Estructuras Dinámicas
Listas Simplemente Enlazadas con nodo cabecera
Eliminación
Ant
Act
L
a1
Ant
a2
a3
a4
a3
a4
Act
L
a1
a2
Estructuras Dinámicas
Listas Simplemente Enlazadas con nodo cabecera
Eliminación
Proc Eliminar (in-out L: Lista; in pos: integer)
Var
Act, Ant: ptr_Nodo;
i: integer;
Begin
Act L; i 1;
while (i < pos) do
Ant Act;
Act Act.prox;
i i + 1;
end
Ant.prox Act.prox;
Liberar(Act);
end
Estructuras Dinámicas
Listas Simplemente Enlazadas con nodo cabecera
Localizar
Func Localizar(L: Lista; e: Tipo_Info): integer
Var
Act: ptr_Nodo;
i, res: integer;
begin
Act L.prox; i 1;
while (Act nil Act.info e) do
Act Act.prox;
i i + 1;
end
if Act = nil then
res -1;
else
res i;
end
return (res);
end