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