Está en la página 1de 49

LAB 04: Listas Enlazadas

IS241 ESTRUCTURA DE DATOS

Prof. J eny Cas tellares


Prof. Carlos Vila

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 1


Contenidos
TAD (Type of Abstract Data)
Listas Enlazadas
Simples
Doblemente Enlazadas
Circulares
Lista de listas

Caso de Estudio: Tienda de Libros


Bibliografa

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 2


Objetivos
Al finalizar esta sesin y concluir satisfactoriamente los ejercicios, el alumno habr adquirido las
habilidades de:
Definir formalmente estructuras de listas doblemente enlazadas.
Implementar una estructura de datos de listas circular y doblemente enlazadas

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 3


Tipos Abstractos de Datos
IS241 ESTRUCTURA DE DATOS

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 4


TAD-Tipos Abstractos de Datos
Para hablar de la abstraccin es necesario tener clara la diferencia que existe entre los datos, los
tipos de datos y los tipos abstractos de datos.
Clasificar los datos en distintos tipos aporta muchas ventajas, como por ejemplo indicarle al
compilador la cantidad de memoria que debe reservar para cada instancia dependiendo del tipo
de dato al que pertenezca. Ej. flotantes, dobles, cadenas de caracteres, . . . , etc.

Un TAD es un tipo de dato definido por el programador. Los tipos abstractos de datos estn
formados por los datos (estructuras de datos) y las operaciones (procedimientos o funciones)
que se realizan sobre esos datos.

TAD = Valores + Operaciones

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 5


TAD Lista
Las listas constituyen una de las estructuras lineales ms flexibles, porque pueden crecer y
acortarse segn se requiera, insertando o suprimiendo elementos tanto en los extremos como
en cualquier otra posicin de la lista, representados por una sucesin de elementos entre
parntesis y separados por comas.

L = (a0, a1, . . . , an-1)

Una propiedad importante de la lista es que sus elementos estn ordenados en forma lineal, es
decir, para cada elemento ai existe un sucesor ai+1 (si i < n - 1) y un predecesor ai+1 (si i
> 0).
Dos listas son iguales si tienen los mismos elementos y en el mismo orden.

(1; 3; 7; 4) (3; 7; 4; 1)

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 6


Operaciones Abstractas sobre Listas
insert: inserta el elemento x en la posicin p, devolviendo una posicin q al elemento insertado.
erase: elimina el elemento en la posicin p, devolviendo una posicin q al elemento que
previamente estaba en la posicin siguiente a p.
retrieve: recupera el elemento en la posicin p, devolviendo una referencia al mismo.
next: dada una posicin dereferenciable p, devuelve la posicin del siguiente elemento.
begin: devuelve la posicin del primer elemento de la lista.
end: devuelve la posicin ficticia (no dereferenciable), despus del final de la lista.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 7


Ejemplo 001: Eliminacin de Elementos
El algoritmo de eliminar elementos duplicados de una lista tiene dos lazos anidados. En el lazo
exterior una posicin p recorre todas las posiciones de la lista. En el lazo interior otras posicin
q recorre las posiciones ms all de p eliminando los elementos iguales a los que estn en p.
Proceso de eliminacin de elementos en purge

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 8


Implementacin de Listas por Arreglos
Probablemente la representacin de listas ms simple de entender es mediante arreglos. En
esta representacin los valores son almacenados en celdas contiguas de un arreglo.
El principal problema de esta representacin es que, para insertar un elemento en una posicin
intermedia de la lista requiere mover todos los elementos que le suceden una posicin hacia el
final.
Igualmente, para borrar un elemento hay que desplazar todos los elementos que suceden una
posicin hacia el comienzo para rellenar el hueco dejado por el elemento eliminado.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 9


Representacin de listas mediante Insercin de un elemento en la representacin
arreglos de listas por arreglos

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 10


Eficiencia de la Implementacin por
Arreglos
La implementacin de listas por arreglos tiene varias desventajas.
Una es la rigidez del almacenamiento, en caso se inserten mas elementos de los disponibles en
el arreglo, solucionado este reubicando cada uno de los elementos en un nuevo arreglo.
Pero el principal inconveniente de esta implementacin se refiere a los tiempos de ejecucin
que requieren un nmero de instrucciones que es proporcional al nmero de ejecuciones de los
lazos correspondientes, es decir, proporcional al nmero de elementos que deben moverse.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 11


Implementacin Mediante Celdas
Enlazadas por Punteros
Es probablemente la ms conocida y ms usada.
La lista est compuesta de una serie de celdas de tipo cell que constan de un campo elem
de tipo elem_t y un campo next de tipo cell *. Las celdas se van encadenando unas a
otras por el campo next.

Celdas enlazadas por punteros Operaciones de enlace necesarias para insertar


un nuevo elemento en la lista

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 12


Listas Enlazadas
IS241 ESTRUCTURA DE DATOS

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 13


TADs Lineales: Listas
Las Listas son tipos de datos abstractos lineales que representan secuencias de elementos y que
presentan una particular flexibilidad en su manejo.
Una lista es equivalente a un contenedor de elementos, donde los valores pueden repetirse a
diferencia de los conjuntos los cuales no pueden tener dos elementos repetidos.
Las listas difieren de los arreglos porque sus elementos no se encuentran indexados, es decir, el
acceso a cada elemento debe ser hecho de forma secuencial, mientras que en los arreglos se
hace de forma aleatoria.
La posicin de un elemento dentro de una lista es el lugar ocupado por dicho elemento dentro
de la secuencia de valores que componen la estructura.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 14


Mapa Conceptual de las Listas

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 15


Implementacin
Mediante Arreglos
Al usar arreglos para almacenar los elementos de la lista la opcin es almacenar a los elementos
en celdas contiguas.
Ventajas
Existe un rpido acceso aleatorio a los elementos
Presenta un eficiente manejo de memoria: se necesita muy poca memoria.

Desventajas
La eliminacin e insercin de elementos toma mucho tiempo
Se debe conocer el tamao mximo del arreglo y este no se puede modificar luego de indicado.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 16


Implementacin
Mediante Referencia a Objetos
Esta forma de implementacin de listas es a travs del uso de referencias a objetos que
permitan enlazar los elementos consecutivos.
Sin embargo, con arreglos, una lista de enteros ocupa en memoria lo que ocupa un entero por
cada elemento. Con referencias a objetos, por cada elemento nuevo es necesario crear un
contenedor que este listo para almacenarlo y para enlazarse con el siguiente elemento. Este
contenedor se conoce como Nodo.
En una lista simplemente enlazada, un Nodo tiene la siguiente estructura:

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 17


Listas Simplemente Enlazadas
Una lista enlazada consiste en una secuencia de nodos, en los que se guardan campos de datos
arbitrarios y una referencia al nodo posterior.
La referencia que cada Nodo contiene no es ms que una propiedad del nodo que almacena la
direccin de memoria del siguiente nodo, o un valor Nulo si el nodo no se encuentra enlazado
con un siguiente nodo.
El nodo que contiene an (lista = a1, a2, ... an) contiene una referencia a un valor nulo. De
esa forma, una lista enlazada puede ser representada grficamente de la siguiente forma:

Nodo de lista enlaza Lista enlaza simple cargada con interos


simple

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 18


Listas Simplemente Enlazadas
Insercin
Agregar un nodo presenta dos casos:
Head = en tal caso el nodo agregado se convierte en la cabeza y la cola de la lista
Agregar un nodo en la cola de la lista actualizando las referencias apropiadas

Algoritmo:
1) Add(value)
2) Pre: value is the value to add to the list
3) Post: value has been placed at the tail of the list
4) n node(value)
5) if head =
6) head n
7) tail n
8) else
9) tail.Next n
10) tail n
11) end if
12) end Add

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 19


Listas Simplemente Enlazadas
Bsqueda
Para la bsqueda en una lista enlazada, simplemente debemos recorrer la lista revisando los valores que
estamos buscando en cada uno de los valores de la lista enlazada.

Algoritmo:

1) Contains(head, value)
2) Pre: head is the head node in the list
3) value is the value to search for
4) Post: the item is either in the linked list, true; otherwise false
5) n head
6) while n and n.Value value
7) n n.Next
8) end while
9) if n =
10) return false
11) end if
12) return true
13) end Contains

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 20


Listas Simplemente Enlazadas
Eliminacin
Eliminar un nodo de una lista enlazada presenta ciertos casos que se tienen que considerar:
La lista esta vaca
El nodo a remover es el nico nodo de la lista enlazada
Estamos removiendo el nodo cabecera
Estamos removiendo el nodo cola
El nodo a remover esta en algn lado entre la cabecera y la cola
El tem a remover no existe en la lista enlazada

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 21


Listas Simplemente Enlazadas
Eliminacin
Algoritmo:
1) Remove(head, value)
2) Pre: head is the head node in the list
3) value is the value to remove from the list
4) Post: value is removed from the list, true; otherwise false
5) if head =
6) // case 1
7) return false
8) end if
9) n head
10) if n.Value = value
11) if head = tail
12) // case 2
13) head
14) tail
15) else
16) // case 3
17) head head.Next
18) end if
19) return true
20) end if

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 22


Listas Simplemente Enlazadas
Eliminacin
Algoritmo:

21) while n.Next and n.Next.Value value


22) n n.Next
23) end while
24) if n.Next
25) if n.Next = tail
26) // case 4
27) tail n
28) end if
29) // this is only case 5 if the conditional on line 25 was false
30) n.Next n.Next.Next
31) return true
32) end if
33) // case 6
34) return false
35) end Remove

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 23


Listas Simplemente Enlazadas
Recorriendo la Lista
El procedimiento de recorrido de una lista simplemente enlazada es el mismo que el de una lista
doblemente enlazada, en el cual se deben contemplar dos casos:
Nodo = , habiendo agotado todos los nodos de la lista enlazada
Debemos actualizar la referencia al nodo haciendo node.Next

Algoritmo:

1) Traverse(head)
2) Pre: head is the head node in the list
3) Post: the items in the list have been traversed
4) n head
5) while n 0
6) yield n.Value
7) n n.Next
8) end while
9) end Traverse

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 24


Implementacin
Diagrama de Clases de la Lista Enlazada

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 25


Clase Nodo
Atributos
Cdigo Java
public class Nodo
{
private int dato;

//auto referencia
private Nodo enlace;

public Nodo()
{
this.dato = 0;
this.enlace = null;
}

public Nodo(int dato)


{
this.dato = dato;
this.enlace = null;
}

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 26


Clase Nodo
Mtodos
Cdigo Java

public int getDato()


{ return dato; }

public void setDato(int dato)


{ this.dato = dato; }

public Nodo getEnlace()


{ return enlace; }

public void setEnlace(Nodo enlace)


{ this.enlace = enlace; }

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 27


Clase Lista
Atributos
Cdigo Java

public class Lista


{
private Nodo primero;
private Nodo ultimo;

public Lista()
{
this.primero = null;
this.ultimo = null;
}

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 28


Clase Lista
Anexar Nodo - Inicio
Cdigo Java
public void anexarInicioLista(int dato)
{

Nodo nuevo;
nuevo = new Nodo(dato);

if (primero == null)
{
primero = nuevo;
ultimo = nuevo;
}
else
{
nuevo.setEnlace(primero);
primero = nuevo;
}

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 29


Clase Lista
Anexar Nodo - Final
Cdigo Java
public void anexarFinalLista (int dato)
{
Nodo nuevo;
nuevo = new Nodo(dato);

if (primero == null)
{
primero = nuevo;
ultimo = nuevo;
}

else
{
ultimo.setEnlace(nuevo);
ultimo = nuevo;
}
}

public boolean esVacia ()


{ return (primero == null); }

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 30


Clase Lista
Buscar Nodo
Cdigo Java

public boolean buscarNodo(int dato)


{
boolean encontro = false;
Nodo p = primero;

while (p.getEnlace() != null && encontro == false)


{
if(p.getDato() == dato)
encontro = true;

p = p.getEnlace();
}

return encontro;
}

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 31


Clase Lista
Eliminar un Nodo
Cdigo Java
public boolean borrarNodoInicio()
{
if (esVacia())
return false;

if(primero.getEnlace() == null)
{
primero = null;
ultimo = null;
return false;
}
else
{
Nodo temp = primero;
primero = primero.getEnlace();
temp.setEnlace(null);
return true;
}
}

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 32


Clase Lista
Imprimir un Lista
Cdigo Java
public String imprimirLista( )
{
String str = "";

if(!esVacia())
{
Nodo p = primero;

while(p.getEnlace() != null)
{
str += p.getDato() + " ";
p = p.getEnlace();
}
}
else
{ str = "Lista Vacia"; }

return str;
}
}

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 33


Ejemplo 002: Reordenamiento de Listas
Supongamos que deseamos mover el nodo T del final al inicio de la lista.
A. En un arreglo moveramos cada tem para dar cabida al nuevo elemento en el inicio

B. En la lista enlazada solo deberamos cambiar tres enlaces: hacer que el nodo T apunte a A, el nodo S
apunte a Z y la cabecera apunte a T.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 34


Ejercicio 001
A. Crear la aplicacin en Java para la lista con la descripcin del Ejemplo 002 e implementar el
mtodo de re-ordenamiento citado en la seccin 'B' bajo las mismas condiciones.
B. Implemente una aplicacin en Java que permita contar con las siguientes funcionalidades,
las mimas que sern accedidas desde un men de opciones.

1. Crear lista
2. Imprimir lista
3. Anexar nodos Inicio
4. Anexar nodos final
5. Buscar nodos
6. Borrar nodo inicio
7. Borrar nodo final
8. Salir";

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 35


Listas Doblemente Enlazadas
En las listas doblemente enlazadas, cada nodo tiene dos enlaces: uno apunta al nodo anterior, o
apunta al valor Nulo si es el primer nodo; y otro que apunta al siguiente nodo, o apunta al valor
Nulo si es el ltimo nodo.

Nodo de una lista doblemente enlazada

Lista doblemente enlazada cargada con enteros

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 36


Listas Doblemente Enlazadas
Insercin
La nica diferencia entre el algoritmo de insercin de la lista simplemente enlazada es que
necesitas asociar el enlace al nodo anterior al n, si n no es el primer nodo, este debe ser
insertado en la lista.

Algoritmo:
1) Add(value)
2) Pre: value is the value to add to the list
3) Post: value has been placed at the tail of the list
4) n node(value)
5) if head =
6) head n
7) tail n
8) else
9) n.Previous tail
10) tail.Next n
11) tail n
12) end if
13) end Add

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 37


Listas Circulares
En una lista enlazada circular, el primer y el ltimo nodo estn unidos.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 38


Listas Doblemente Enlazadas Circulares
Una lista circular puede tambin ser doblemente encadenada (o enlazada):

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 39


Listas de Listas
En las listas de listas, el campo de datos de un nodo puede ser otra lista enlazada.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 40


Lista de Prioridades
Esta estructura de datos es similar a la anterior pero las sub-listas estn ordenadas de acuerdo a
una prioridad especfica.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 41


Caso de Estudio: Tienda de Libros
Se debe desarrollar una aplicacin usando el lenguaje de programacin Java, empleando la
implementacin del TAD de una lista (puede ser una lista doblemente enlazada, circular o
doblemente enlazada circular). La aplicacin deber manejar informacin relacionada con una
tienda de libros, de acuerdo al siguiente ejemplo:
ISBN: 130369977
Titulo: Estructura de datos con C y C++
Edicion: Segunda
Idioma: Espaol
Ao: 2001
Editorial: Prentice Hall
Autores:
Nombres Apellidos:
Yedidyah Langsam, Moshe J. Augenstein, Aaron M. Tenembaum.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 42


Caso de Estudio: Tienda de Libros
Nota: El nmero de autores que se pueden almacenar no se encuentra definido (esto le obliga a
utilizar una lista de autores).
El programa debe permitir realizar las siguientes operaciones:
Agregar toda la informacin sobre un libro.
Borrar un libro de la lista.
Buscar un libro por ISBN y presentar de forma clara toda su informacin.
Buscar libros por Titulo y presentar de forma clara toda su informacin.
Buscar los libros por autor.
Mostrar el listado de todos los libros.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 43


Caso de Estudio: Tienda de Libros
Diagrama de Clases

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 44


Caso de Estudio: Tienda de Libros
Diagrama de Clases
Se puede apreciar en el diagrama lo siguiente:
La clase Autor representa un autor que tiene como atributos nombres y apellidos.
La clase Libro representa un libro con todos los atributos solicitados. Como un libro tiene varios autores,
stos se almacenan en una Lista de Autores.
La clase Tienda representa la tienda de libros, donde estn las operaciones de los requisitos solicitados.
Conceptualmente una tienda posee un conjunto de libros. En este caso el atributo libros es una Lista de
Libros.
Las Clases Lista y Nodo representan la Lista como tal.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 45


Caso de Estudio: Tienda de Libros
Clase Tienda
Estructura en Java
public class Libro
{
// Atributos
Private String isbn;
Private String titulo;
Private String edicion;
Private String idioma
Private int ao;
Private String editorial;
Private String resumen;
Private Lista <Autor> autores;

// Mtodos
// ...
}

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 46


Ejercicio 002
Desarrollar la aplicacin completa en Java del caso de estudios Tienda de Libros antes descrito,
haciendo uso de listas doblemente enlazadas para los libros y considerando todas las acciones u
opciones descritas.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 47


Ejercicios Propuestos
IS241 ESTRUCTURA DE DATOS

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 48


Jose Fger, Libardo Pantoja. Estructuras de Datos.
Proyecto LATIn. Pg. 111-138.
Cristian Bottazzi, Santiago Costarelli. Algoritmos y
Estructuras de Datos. Pg. 48-82.
Granville Barnett, Luca Del Tongo. Data Structure and
Bibliografa Algorithms. Pg. 09-18.
IS241 Estructura de Datos Robert Sedgewick. Algorithms in C. Pg. 17-25.

02/06/2017 Prof. Jeny Castellares / Prof. Carlos Vila 49

También podría gustarte