Vous êtes sur la page 1sur 18

ADT Lista

-Implementacin a travs de
Nodos Simplemente Enlazados -Comparacin de las implementaciones -Mejoras

ADT LISTA
Coleccin de datos, con las siguientes caractersticas: -Por lo general los datos son de un mismo tipo. -Cada elemento tiene asociado un ndice posicin, a travs del cual se puede acceder y que lo identifica de manera nica en la coleccin. a0 a1 a2 a3 ... aN-1 Esto quiere decir que los elementos en una lista se encuentran organizados de una manera lineal e identificados a travs de una posicin. No se especifica cmo estn organizados fsicamente en la memoria.

ADT LISTA - OPERACIONES


Crear -crea e inicializa la lista Destruir -destruye la lista Adicionar -adiciona un nuevo elemento, al final de la lista Insertar -inserta un nuevo elemento en una posicin Eliminar -elimina un elemento dada su posicin Obtener -retorna un elemento dada su posicin Modificar -modifica un elemento dada su posicin y el nuevo valor Cantidad -retorna la cantidad de elementos de la lista Vacia -retorna verdadero si la lista est vaca, falso si no Buscar -determina la posicin de un elemento en la lista Estas operaciones son las nicas permitidas sobre una lista. Son independientes de cmo sea implementada

ADT LISTA INTERFASE JAVA


public interface TLista { void Adicionar(Object dato); void Insertar(Object dato, int pos); void Eliminar(int pos); int boolean Object void int int } Cantidad(); Vacia(); Obtener(int pos); Modificar(Object dato, int pos); Buscar(Object dato); Buscar(Object dato, TComparar cmp);

-Los elementos de la lista sern de tipo Object -La operacin de Crear la har el constructor de la clase que implementa TLista -La operacin Destruir no es necesaria ya que la realiza el sistema automtico de recoleccin de basura del Java

ADT LISTA IMPLEMENTACIN MEDIANTE NODOS SIMPLEMENTE ENLAZADOS


Los elementos de la lista se representan en Nodos, donde cada nodo contiene: -El elemento (Object) que almacena la informacin -Enlace al prximo elemento de la lista

ADT LISTA IMPLEMENTACIN MEDIANTE NODOS SIMPLEMENTE ENLAZADOS, JAVA


public class TListaP implements TLista { private class TNodoSEP { Object elem; TNodoSEP prox; } private TNodoSEP L; ... ... }

Constructor:
public TListaP() { L=null; }

Cantidad y Vaca
public int Cantidad() public boolean Vacia() { { int cantidad; return L == null; TNodoSEP aux; } cantidad=0; aux = L; while( aux != null ) { cantidad++; aux = aux.prox; } return (cantidad); }

Adicionar
public void Adicionar(Object dato) { TNodoSEP nuevo, aux; nuevo = new TNodoSEP(); nuevo.elem = dato; nuevo.prox = null; if ( L != null ) { aux = L; while( aux.prox != null ) aux = aux.prox; aux.prox = nuevo; } else L = nuevo; }

Insertar
public void Insertar(Object dato, int pos) { TNodoSEP nuevo, aux; int i; nuevo = new TNodoSEP(); nuevo.elem = dato; if( pos <= 0 ) { nuevo.prox = L; L = nuevo; } else { aux = L; for( i=0; i < pos-1 && aux != null; i++) aux=aux.prox; if ( aux != null ) { nuevo.prox = aux.prox; aux.prox = nuevo; } } }

Eliminar
public void Eliminar(int pos) { TNodoSEP elim, aux; int i; if( L != null ) { if ( pos <= 0 ) L = L.prox; else { aux = L; for(i=0; i < pos-1 && aux != null; i++) aux = aux.prox; if ( aux != null && aux.prox != null ) { elim = aux.prox; aux.prox = elim.prox; } } } }

public Object Obtener(int pos) { TNodoSEP aux; int i; aux = L; for( i=0; i < pos && aux != null; i++ ) aux = aux.prox; if ( aux != null ) return aux.elem; else return null; } public void Modificar(Object dato, int pos) { TNodoSEP aux; int i; aux = L; for( i=0; i < pos && aux != null; i++ ) aux = aux.prox; if ( aux != null ) aux.elem = dato; }

public int Buscar(Object dato) { TNodoSEP aux; int encontrado = -1; aux = L; for( int i=0; aux != null && encontrado == -1 ; i++ ) { if ( aux.elem.equals( dato ) ) encontrado = i; else aux = aux.prox; } return encontrado; }
public int Buscar(Object dato, TComparar cmp) { . . . if ( cmp.Compara(aux.elem, dato ) == 0 . . . }

Comparacin de las implementaciones


Ventajas de la implementacin mediante arreglos: -La representacin de la informacin es muy simple ya que los Arreglos (es una estructura de datos que poseen todos los lenguajes), precisamente permiten almacenar una coleccin de datos de un mismo tipo, de manera lineal, asignndole una posicin a cada elemento. -El acceso a los elementos es directo. El costo es el mismo para cualquier elemento de la lista. La operacin es muy eficiente, desde el punto de vista de implementacin, debido a que los elementos de los arreglos se almacenan de manera contigua en la memoria. Desventajas de la implementacin mediante arreglos: -El uso de la memoria no es eficiente, ya que requiere tener reservado un espacio para los elementos de la lista. Este espacio puede, adems, resultar insuficiente en determinado momento, requirindose una reasignacin de memoria. De igual manera este espacio puede ser subutilizado si la lista contiene pocos elementos. -Las operaciones de insertar y eliminar requieren realizar un proceso de corrimiento de la informacin (hacia la derecha hacia la izquierda), lo cual puede ser costoso para listas con muchos elementos.

Comparacin de las implementaciones


Ventajas de la implementacin mediante nodos simplemente enlazados: -El uso de la memoria es ms eficiente ya que se reserva nicamente el espacio necesario para almacenar los elementos que en un momento dado se encuentran en la lista. -Las operaciones de insertar y eliminar no requieren corrimiento de informacin ya que los datos no se encuentran de forma consecutiva en memoria. Slo se requiere un reajuste de los punteros.

Desventajas de la implementacin mediante nodos simplemente enlazados : -La implementacin es mas compleja, requiere mayor esfuerzo por parte del programador para poder mantener la relacin de posicin entre los elementos (a travs de los enlaces). -El acceso a los elementos es secuencial. El costo es alto y directamente proporcional a la posicin del elemento que se accede. La operacin requiere que se recorra la lista desde el principio para acceder a cualquier elemento ya que la nica manera de llegar a un elemento es siguiendo los enlaces desde inicio de la lista.

Mejoras a la implementacin con nodos enlazados:


1) Utilizar la misma estructura de los nodos de TListaP, pero con ms atributos: -Agregar a los atributos: -cantidad (cantidad de elementos que hay en la lista: con el objetivo de no tener que recorrer toda la lista en el mtodo Cantidad()) -posact (ltima posicin accedida en la lista: con el objetivo de llegar mas pronto a la posicin del elemento que se quiera acceder, si es que posact es menor que esta posicin -nodoact (nodo correspondiente a posact)
public class TListaPM implements TLista { private class TNodoSEP { Object elem; TNodoSEP prox; } private TNodoSEP L, nodoact; private int cantidad, posact;

Mejoras a la implementacin con nodos enlazados:


2) Utilizar nodos doblemente enlazados y ms atributos:
public class TLista2P implements TLista { private class TNodoDEP { Object elem; ant TNodoDEP ant, prox; }
private TNodoDEP L, F; private int cantidad; public TLista2P() { L=F=null; cantidad=0; }

elem prox

L
null cantidad = 3

F
null

Otras Implementaciones del ADT Lista


-Nodos Simplemente Enlazados (con Nodo Cabeza). Evita considerar el caso particular de lista vaca en las operaciones de Insertar, Adicionar y Eliminar. -Nodos Doblemente Enlazados. Cada nodo contiene dos enlaces: Uno al prximo y otro al anterior. Con la inclusin de un atributo adicional para tener la cantidad de elementos, se mejora considerablemente la implementacin. -Circulares, con nodos simplemente enlazados. El ltimo nodo est enlazado con el primero -Circulares, con nodos doblemente enlazados. El ltimo nodo est enlazado con el primero, y ste con el ltimo.

Ejercicios propuestos
Implementar las clases:

1) TListaPM (TLista con nodos simplememente enlazados Mejorado)


2) TLista2P (TLista con nodos Doblemente enlazados)

Vous aimerez peut-être aussi