Lectura 3 - Listas Enlazadas
Lectura 3 - Listas Enlazadas
Lectura 3 - Listas Enlazadas
Unidad 3
Lectura 3
3- LISTAS ENLAZADAS
Frases introductorias
Las listas enlazadas son estructuras de datos complejas dinmicas que
permiten almacenar los elementos de acuerdo a un criterio de orden, esto
las diferencia de las pilas y colas por tener orden lgico distinto al orden
fsico.
El nodo cabecera no
guarda ningn dato, solo
la referencia al primer
nodo de la lista.
ackage com.estructuras;
public class Nodo<T extends Object> {
private T dato; //cualquier tipo de valor,
private Nodo<T> sig;
public Nodo() {
this.dato = null;
this.sig = null;
}
public T getDato() {
return dato;
}
public void setDato(T dato) {
this.dato = dato;
}
public Nodo getSig() {
return sig;
}
public void setSig(Nodo sig) {
this.sig = sig;
}
public Nodo(T dato) {
this.dato = dato;
}
public Nodo(T dato, Nodo sig) {
this.dato = dato;
this.sig = sig;
}
}
Tmp.dato = x;
Crear()
Insertar()
Eliminar()
Buscar()
Listar()
//equals
String s1 = Hola";
String s2 = hola";
if (s1.equals(s2)){
// s1 y s2 tinen el mismo contenido, devuelve true
}
if (s1 == s2) {
// compara si s1 y s2 tienen la misma referencia
}
El mtodo compareTo()
Para comparar dos objetos es posible hacerlo con el mtodo compareTo(),
de la clase String del paquete java.lang.
Este mtodo permite comparar por igual, mayor y menor valor,
devolviendo 0, 1 -1 respectivamente. Veamos un ejemplo muy simple:
//compareTo(Object object)
String s1 = Hola";
String s2 = hola";
if (s1.compareTo(s2) > 0) {
// s1 es ms grande que s2
}
else if (s1.compareTo(s2) == 0 {
// s1 y s2 son iguales
}
else
// s1 es menor a s2
package modelo;
import estructuras.*;
@SuppressWarnings("unchecked")
public class Medico implements Comparable {
private
private
private
private
String Nombre;
String Apellido;
Integer CodigoDeMedico;
Integer NumeroDeMatricula;
public Medico() {
}
public String getNombre() {
return Nombre;
}
public void setNombre(String nombre) {
Nombre = nombre;
}
//se completa con los getxx() y setXX() de los dems
atributos
public String toString(){
return "Nombre: " + this.getNombre() +
"\nApellido: " + this.getApellido() +
"\nCodigo Identificatorio: " +
this.getCodigoDeMedico() +
"\nNumero De Matricula: " +
this.getNumeroDeMatricula();
}
//mtodo para comparer el objeto active con el recibido por
cdigo de mdico, devuelve 0, 1 -1
public int compareTo(Object m) {
Medico medico = (Medico)m;
return
this.getCodigoDeMedico().compareTo(medico.getCodigoDeMedico())
}
}
package com.estructuras;
public class Nodo<T extends Object> {
private T dato; //cualquier tipo de valor,
private Nodo<T> sig;
public Nodo() {
this.dato = null;
this.sig = null;
}
public Nodo(T dato) {
this.dato = dato;
}
public Nodo(T dato, Nodo sig) {
this.dato = dato;
this.sig = sig;
}
public T getDato() {
return dato;
}
public void setDato(T dato) {
this.dato = dato;
}
public Nodo getSig() {
return sig;
}
public void setSig(Nodo sig) {
this.sig = sig;
}
}
package com.estructuras;
public interface ILista {
public
public
public
public
public
public
public
void Vaciar();
void Insertar(Comparable dato);
boolean EsVacia();
boolean Buscar(Comparable dato);
Object Eliminar(Comparable dato);
String ListarAscendente();
String ListarDescendente();
package com.estructuras;
public class Lista<T extends Object> implements ILista {
private Nodo cabecera;
private Nodo ultimo;
public Lista () {
this.cabecera = null;
this.ultimo = null;
}
public Nodo getCabecera() {
return cabecera;
}
public void setCabecera(Nodo primero) {
this.cabecera = primero;
}
public Nodo getUltimo() {
return ultimo;
}
public void setUltimo(Nodo ultimo) {
this.ultimo = ultimo;
}
..
package com.estructuras;
public class Lista<T extends Object> implements ILista<T> {
private Nodo<T> cabecera;
private Nodo<T> fin; //puede no usarse
public Lista() {
package com.estructuras;
import java.exception.*;
public class ListaEnlazadaIter<T extends Object> implements
IListaIter<T> {
.
}
nuevo.ant = ltimo
nuevo.sig = NULL
ltimo.sig = nuevo
ltimo = nuevo
Insercin al medio:
Elimina el primero:
Elimina el ltimo:
Listas circulares
Las listas enlazadas circulares pueden ser simplemente enlazadas o
doblemente enlazadas, ambas tienen la caracterstica de no tener nulos en
los nodos de los extremos.
En las listas simplemente enlazadas, el ltimo nodo enlaza con el primero.
En las listas doblemente enlazadas el primero enlaza con el ltimo nodo y el
ltimo enlaza con el primero.
Recordemos entonces:
//Elimina el primero
Cabecera.siguiente.anterior = cabecera.anterior ;
Cabecera = cabecera.siguiente;
Cabecera.anterior = ultimo;
//Elimina al ltimo
Ultimo.anterior.siguiente = cabecera;
Ultimo = ultimo.anterior;
Cabecera.anterior = ultimo;
3.5 Implementacin
Una vez que aprendimos las caractersticas de las estructuras de datos
Listas enlazadas, simples, dobles y circulares con el uso de las Interfaces
necesarias para las operaciones, estamos en condiciones de poder hacer un
ejercicio con Listas doblemente enlazadas con clases Iteradoras.
Hay situaciones en las que es necesario relacionar ms de una estructura
para resolverla. Veamos el siguiente caso:
Una Clnica almacena los datos de los pacientes que van llegando a los
turnos por orden de llegada en una cola por mdico. Como son varios los
mdicos que atienden en un mismo horario, organiza los datos de los
mdicos en una lista doblemente enlazada, ordenada por cdigo de mdico.
Datos del nodo de la Cola:
Objeto paciente
sig de la cola
Objeto Paciente:
Nro. De Historia clnica
Apellido y nombre
Dni
Objeto Mdico:
Cdigo de mdico
Nro. De matrcula
Apellido y nombre
Cola de pacientes
Es necesario disear las clases del modelo y utilizar las clases del package
modelo como librera, o sea si logr que fuesen generales para cualquier
objeto no se deberan modificar, solo reusar.
Efectuar las siguientes operaciones para N pacientes y N mdicos:
Ingresar los datos de los mdicos en la lista.
Cuando llega un paciente buscar el mdico en la lista y cargar los datos en la
cola.
Ingresando un cdigo de mdico, mostrar todos los pacientes que tiene en
cola de espera.
package modelo;
import estructuras.*;
public class Medico implements Comparable {
private
private
private
private
private
String Nombre;
String Apellido;
Integer CodigoDeMedico;
Integer NumeroDeMatricula;
Cola c; //estructura Cola como atributo
public Medico() {
}
public Medico(String nombre, String apellido,
Integer codigoDeMedico,
Integer numeroDeMatricula, Cola c) {
Nombre = nombre;
Apellido = apellido;
CodigoDeMedico = codigoDeMedico;
NumeroDeMatricula = numeroDeMatricula;
Es importante
this.c
= c; que repase tambin las sentencias
}repetitivas for, while y do while utilizndolos en la
programacin.
Clase Paciente:
package modelo;
public class Paciente implements Comparable {
private
private
private
private
String Nombre;
String Apellido;
Integer NumeroDeHistoriaClinica;
Integer Dni;
public Paciente() {
}
public Paciente(String nombre, String apellido,
Integer numeroDeHistoriaClinica, Integer
dni) {
Nombre = nombre;
Apellido = apellido;
NumeroDeHistoriaClinica = numeroDeHistoriaClinica;
Dni = dni;
}
public String getNombre() {
return Nombre;
}
public void setNombre(String nombre) {
Nombre = nombre;
}
public String toString(){
return "Nombre: " + this.getNombre() +
"\nApellido: " + this.getApellido() +
"\nNumero De Historia Clinica: " +
this.getNumeroDeHistoriaClinica() +
"\nDni: " + this.getDni();
}
//mtodo para comparer a completer con el atributo necesario
public int compareTo(Object o) {
return 0;
}
}
package com.estructuras;
public class Nodo<T extends Object> {
private T dato; //cualquier tipo de valor,
private Nodo<T> sig;
public Nodo() {
this.dato = null;
this.sig = null;
}
public T getDato() {
return dato;
}
public void setDato(T dato) {
this.dato = dato;
}
public Nodo getSig() {
return sig;
}
public void setSig(Nodo sig) {
this.sig = sig;
}
public Nodo(T dato) {
this.dato = dato;
}
public Nodo(T dato, Nodo sig) {
this.dato = dato;
this.sig = sig;
}
}
package com.estructuras;
public interface ICola {
public
public
public
public
public
public
public
public
public
int tamanyo();
boolean isVacia();
void vaciar();
void insertar(Object dato);
Object primero();
void listar();
Object quitarPrimero();
void buscar(Object dato);
Object buscarO(Object dato);
Estructura Cola:
package com.estructuras;
public class ColaEnlazada implements ICola {
private Nodo primero;
private Nodo ultimo;
private int tamanyo;
public ColaEnlazada() {
this.primero = null;
this.ultimo = null;
this.tamanyo = 0;
}
.. //getxx() y setxx() necesarios
Operaciones
public boolean isVacia() {
return (primero==null);
}
public void vaciar() {
primero=null;
ultimo=null;
}
//inserta un Nuevo elemento
public void insertar(Object dato) {
if (dato!=null) {
Nodo nuevo = new Nodo(dato, null);
tamanyo++;
if (isVacia()) {
this.primero=nuevo;
} else {
ultimo.setSig(nuevo);
}
ultimo=nuevo;
}
}
Nodo doble:
package com.estructuras;
public class NodoDoble<T extends Object>{
private T dato;//cualquier tipo de valor,
private NodoDoble<T> sig;
private NodoDoble<T> ant;
public NodoDoble() {
this.dato = null;
this.sig = null;
this.ant = null;
}
public NodoDoble(T dato) {
this.dato = dato;
}
public NodoDoble(T dato, NodoDoble sig) {
this.dato = dato;
this.sig = sig;
}
public NodoDoble(T dato, NodoDoble sig, NodoDoble ant)
{
this.dato = dato;
this.sig = sig;
this.ant = ant;
}
//con sus getxx() y setxx()
Interfaz de la lista:
package com.estructuras;
public interface IListaDoble<T extends Object>{
public Boolean esVacia();
public void vaciar();
public void listarAscendente();
public void listarDescendente();
}
Conclusin
Con lo visto en esta unidad usted est en condiciones de plantear el diseo
de clases y la codificacin organizada en paquetes de dichas clases.
En el planteo de solucin de un caso deber ver en qu estructuras de datos
almacenar los objetos, para ello tiene las estructuras estticas como las
colecciones de arreglos o las estructuras dinmicas lineales como Pila, Cola,
Listas enlazadas.
Dependiendo de cmo deba tratar los datos almacenados est en
condiciones de poder elegir la estructura que ms le convenga utilizar.
Recuerde siempre tratar de disear cdigo reutilizable y tener sus propias
libreras, las cuales podr utilizar en distintos proyectos.
Espero que le haya sido de utilidad lo aprendido en este mdulo.
Bibliografa Lectura 3
Mark Allen Weiss, Estructuras de Datos en Java, ed. Addison Wesley. 2000
Deitel y Deitel, Java cmo programar , sptima edicin, ed. Pearson, 2008.
Pressman Roger, (2006), Ingeniera de Software. Un enfoque prctico 6ta.
edicin, Ed. McGraw Hill
www.uesiglo21.edu.ar