Vous êtes sur la page 1sur 31

AE | TAD LISTA

Universidad ORT Uruguay


Docente: Ing. Florencia
AGENDA
Listas
Definicin y Estructura

Concepto de Punteros

Estructuras Dinmicas
Vector vs. Lista

Concepto de TAD TAD Lista


Lista Simplemente Encadenada
Lista Doblemente Encadenada
Lista Circular
LISTA SIMPLEMENTE ENCADENADA
Definicin: Una lista es una estructura de datos que
contiene una secuencia lineal de un nmero arbitrario de
tems del mismo tipo.

Los tems pueden ser de cualquier tipo de datos.


Nmeros: (1, 9, 3, 2, 7, 8, 0)
Caracteres: (H, O, L, A)
Ciudades: (MVD, BSAS, NY)

Necesitamos definir el orden de los tems!


LISTA SIMPLEMENTE ENCADENADA
Llamaremos Nodo a cada elemento de la lista.
Cada nodo contiene al menos:
Un tem de informacin (de cualquier tipo).
Un puntero al siguiente nodo de la lista.

Qu es un puntero?
Es una referencia a una direccin de memoria.
En otras palabras: es una variable cuyo valor es una direccin
de memoria.

Cmo se almacena un puntero?


Se almacena en una direccin de memoria como cualquier
otra variable.
PUNTEROS / REFERENCIAS
var. x Memoria
D104

Pos: D217 D104 35 y

.
var. y .
35 .
.
Pos: D104
D217 D104 x
OPERACIONES CON PUNTEROS
var. x Memoria
D104 var. w

Pos: D217 D104 D104 35 y

.
var. y .
35
70 .
.
Pos: D104
D217 D104 x
w = x
y = 70
LISTA SIMPLEMENTE ENCADENADA
DEFINICIN DE LA ESTRUCTURA

class Lista{
NodoLista inicio;
}
class NodoLista {
Object dato;
NodoLista siguiente;
}
LISTA REPRESENTACIN GRFICA

NodoLista

dato siguiente

lista A B C
LISTA SIMPLEMENTE ENCADENADA
Algunas convenciones:
El primer nodo o elemento de la lista se llama head (cabeza)y
asumimos que en la notacin es el de ms a la izquierda.
Remover el primer elemento de la lista, nos deja con una lista
que llamaremos tail (cola) de la lista.
El ltimo elemento (el que no tiene siguiente elemento) debe
apuntar a nada. Esto lo denotamos con NULL.

En el ejemplo:
Head (MVD, BSAS, NY) = MVD.
Tail (MVD, BSAS, NY) = (BSAS, NY)
TIPO ABSTRACTO DE DATOS
Un tipo abstracto de datos (TAD) es un tipo de datos
junto con las operaciones definidas para l
(procedimientos de acceso), independientemente de su
implementacin.

Es un tipo de datos, y como tal puede ser especificado


con precisin, pero no est dado como un tipo de datos
concreto del lenguaje.

Cmo se define?
Bsicamente dndole un nombre y asociando a l un
conjunto de operaciones aplicables a los elementos del
tipo.
TIPO ABSTRACTO DE DATOS
Cmo se implementa?
Asociando un mtodo (cdigo) a cada una de las
operaciones definidas sobre el conjunto.
Definimos cmo lo hace.

Ventajas
La separacin de la especificacin (definicin) y la
implementacin ayuda a reducir la complejidad de la tarea a
realizar.
El cambio en la implementacin de alguna de las operaciones
del TAD no afecta a los programas que utilizan las
operaciones de dicho TAD.
PROCEDIMIENTOS DE ACCESO
Definimos un conjunto mnimo de funciones para la
manipulacin del TAD. Estos procedimientos de acceso
pueden ser usados para definir otras funciones.

Hay 5 procedimientos de acceso para el TAD lista que se


clasifican en 3 grupos:
Funciones constructoras
Usadas para construir/crear el tipo de datos.
Funciones de predicado
Resultados booleanos usados para testear el tipo de datos.
Funciones de seleccin
Seleccionan diferentes partes del tipo de datos.
FUNCIONES CONSTRUCTORAS
Hay dos funciones constructoras bsicas.

//Pos: Constructor, crea la lista vaca.


void Lista();

//Pos: Inserta el Objeto dato al ppio de la lista.


void insertarInicio(Objeto dato);

Luego de aplicar las dos funciones tendramos:


head (l) = dato.
tail (l) = NULL.
FUNCIONES DE PREDICADO
Necesitamos nicamente una funcin de predicado.
//Pos: Retorna true sii la lista no tiene nodos.
boolean esVacia();

Dado que al preguntar por el head o tail de una lista vaca


incurriramos en un error, previamente debemos usar
esVacia() para asegurarnos que la lista contenga algn
elemento.
FUNCIONES DE SELECCIN
Hay dos funciones de seleccin.
//Pre: La lista no es vaca.
//Post: Retorna el primer elemento de la lista.

Objeto head();

//Pre: La lista no es vaca.


//Post: Retorna la lista resultante de remover
el head de la lista.

Lista tail();
TAD LISTA - DEFINICIN
public interface ILista {

/******* CONSTRUCTORES *******/


//Pos: Constructor, crea la lista vaca.
void Lista();

//Pos: Inserta el objeto n al principio de la lista.


void insertarInicio(Objeto n);

/******* PREDICADO *********/


//Pos: Retorna true sii la lista no tiene nodos.
boolean esVacia();

/******* SELECCION **********/


//Pre: La lista no es vaca.
//Pos: Retorna el primer Objeto de la lista.
Objeto head();
TAD LISTA - DEFINICIN
//Pre: La lista no es vaca.
//Pos: Retorna la lista resultante de remover el head de la lista.
Lista tail();

/******* TESTEO **********/


//Pos: Imprime la lista en pantalla.
void imprimir();

/****** BORRADO ********/


//Pos: Borra el primer nodo.
void borrarInicio();

//Pos: Borra todos los nodos de la lista.


void vaciarLista();

}//ILista
TAD LISTA DE ENTEROS - IMPLEMENTACIN
public class NodoLista {
private int elem;
private NodoLista sig;

//Constructor
public NodoLista(int n){
this.elem = n;
this.sig = null;
}
//Elemento
public void setElem(int n){
this.elem = n;
}
TAD LISTA DE ENTEROS - IMPLEMENTACIN
public int getElem(){
return this.elem;
}

//Siguiente
public void setSig(NodoLista sig){
this.sig = sig;
}

public NodoLista getSig(){


return this.sig;
}
TAD LISTA DE ENTEROS - IMPLEMENTACIN
public class Lista implements ILista {
private NodoLista inicio;

public Lista() {
this.inicio = null;
}

public void insertarInicio(int n) {


NodoLista nuevo = new NodoLista(n);
nuevo.setSig(inicio);
this.inicio = nuevo;
}
TAD LISTA DE ENTEROS - IMPLEMENTACIN
public boolean esVacia() {
return this.inicio == null;
}

public int head(){


return this.inicio.getElem();
}

public NodoLista tail(){


return this.inicio.getSig();
}
TAD LISTA DE ENTEROS - IMPLEMENTACIN
public void imprimir() {
if (this.esVacia())
System.out.println("La lista es vaca");
else{
NodoLista aux = this.inicio;
while (aux != null){
System.out.println(aux.getElem());
aux = aux.getSig();
}
}
}
TAD LISTA DE ENTEROS - IMPLEMENTACIN
public void borrarInicio() {
if (!this.esVacia()){
this.inicio = this.inicio.tail();
}
}

public void vaciarLista() {


while (inicio != null){
borrarInicio();
}
}
ESTRUCTURAS DINMICAS - VENTAJAS
Hasta ahora todas las estructuras de datos que hemos
analizado (arrays, matrices) poseen como caracterstica
comn el tener tamao fijo, el cual es declarado en
tiempo de compilacin. Debido a esta restriccin es que
son llamadas estructuras estticas.

Al definir listas estamos trabajando con estructuras


dinmicas, por lo cual no es necesario especificarle su
tamao en tiempo de compilacin. Una lista puede crecer
y contraerse en tiempo de ejecucin.
LISTA ENCADENADA VS. VECTOR
Las listas encadenadas comparten varias operaciones con
los vectores. Ambas estructuras soportan la insercin y
eliminacin de elementos, recorridas sobre la estructura
y otras operaciones bsicas.

La eficiencia de ciertas operaciones es lo que difiere


entre las listas encadenadas y los vectores.
Por ejemplo la operacin asociada con borrar el primer
elemento es ms eficiente en una lista que en un vector.
Por otro lado acceder a un elemento aleatorio es ms eficiente
en un vector que en una lista, la cual debemos recorrer en
orden hasta llegar al ndice buscado.
LISTA ENCADENADA VS. VECTOR
La eficiencia de ciertas operaciones es lo que difiere
entre las listas encadenadas y los vectores.
En las listas encadenadas podemos borrar o insertar un
elemento nicamente reacomodando los punteros.
Usando listas encadenadas debemos ser prolijos con el
manejo de la memoria, ya que pueden quedar porciones de
memoria no referenciables y por lo tanto no recuperables.

lista A B C

aux
LISTA DOBLEMENTE ENCADENADA
Para facilitar el recorrido de una lista en cualquier
direccin, podemos agregar un apuntador adicional a
cada nodo, que apunte al nodo anterior de la lista.

lista

A B C
LISTA DOBLEMENTE ENCADENADA
Cada nodo tiene un nuevo puntero que hace referencia al
nodo anterior en la lista.

La lista doblemente encadenada nos permite movernos


hacia adelante y hacia atrs en la lista.

Tanto el puntero siguiente del ltimo nodo, como el


puntero anterior del primer nodo apuntan a null.
LISTA DOBLEMENTE ENCADENADA
Definicin de la estructura:
class NodoDoble {
Object elem;
NodoDoble anterior;
NodoDoble siguiente;
}
class Lista{
NodoDoble inicio;
}
LISTA CIRCULAR
El ltimo elemento tiene como siguiente al primer
elemento de la lista.

De esta manera no hay punteros a NULL.

Para recorrer la lista precisamos mantener una referencia


(puntero) al primer elemento para saber cuando debemos
parar la recorrida.

lista A B C
LISTA CIRCULAR DOBLEMENTE ENCADENADA
Es la unin de una lista doblemente encadenada con una
lista circular.

Cmo elegir la estructura apropiada para un problema?


Nos debe permitir lograr el objetivo del problema.
Debemos tener en cuenta la complejidad de las funciones
para trabajar con el tipo de TAD lista elegido.

lista A B C

Vous aimerez peut-être aussi