Sie sind auf Seite 1von 16

Estructuras de datos

Estructuras bsicas
Arreglo
Lista enlazada
Simplemente enlazada
Doblemente enlazada

Estructuras de datos en memoria principal

Colecciones implementadas sobre las estructuras bsicas:

Franco Guidi Polanco


Escuela de Ingeniera Industrial
Pontificia Universidad Catlica de Valparaso, Chile
fguidi@ucv.cl

Lista, Lista con iterador


Lista circular
Pila
Cola
Hashtable
Vector (Java)
(Otras)

Actualizacin: 11 de abril de 2006


Franco Guidi Polanco (PUCV-EII)

Arreglo

Listas enlazadas

Es una coleccin ordenada de elementos del


mismo tipo.
Es de largo fijo, definido al momento de
instanciarlo.
El acceso a los elementos se hace a travs de un
subndice.
Fcil de recorrer en ambos sentidos.
Estudiado en cursos anteriores

Franco Guidi Polanco (PUCV-EII)

09-03-2007

09-03-2007

Son estructuras dinmicas: se asigna memoria


para los elementos de la lista en la medida que es
necesario.
Cada elemento se almacena en una variable
dinmica denominada nodo.
En la lista simplemente enlazada, cada nodo
apunta al nodo que contiene el elemento siguiente

Franco Guidi Polanco (PUCV-EII)

09-03-2007

Esquema tentativo de una lista simplemente


enlazada

Datos contenidos en la lista


Los nodos de una lista contendrn datos del tipo
declarado en la estructura del nodo. Por ejemplo:
Tipos primitivos (byte, int, boolean, char, etc.)
Referencias a objetos

Nodos

data

data

data

En los siguientes ejemplos consideraremos el uso


de listas de enteros, aunque las tcnicas que sern
descritas son aplicables a cualquier otro tipo de
lista.

data

head

null

ListaEnlazada

Franco Guidi Polanco (PUCV-EII)

09-03-2007

Diagrama de clases de una lista simplemente


enlazada

head

agregarAlFinal(d:Data)
estContenido(d:Data):boolean
eliminar(d:Data):boolean
imprimirContenido()

public class Lista{


Nodo head = null;
public void agregarAlFinal(int data){
...
}
public void imprimirContenido(){
...
}
public boolean estaContenido(int data){
...
}
public boolean eliminar(int data){
...
}
}

Nodo
data:int
getData():int
setNext(n:Nodo)
getNext():Nodo
Nodo(d:Data,n:Nodo)

Diagrama de objetos:
:Lista

head:Nodo
data = 1

Franco Guidi Polanco (PUCV-EII)

09-03-2007

Declaracin de la Lista:

next
1..1

09-03-2007

Una lista simplemente enlazada (versin


preliminar)

Diagrama de clases (lista de enteros):


Lista

Franco Guidi Polanco (PUCV-EII)

:Nodo

:Nodo

data = 20

data = -1

Franco Guidi Polanco (PUCV-EII)

09-03-2007

Nodos en una lista simplemente enlazada

Insercin en la lista simplemente enlazada

Insertar elementos:

public class Nodo{


private int data;
private Nodo next;
public Nodo(int d, Nodo n){
data = d;
next = n;
}
public int getData(){
return data;
}
public Nodo getNext(){
return next;
}
public void setNext(Nodo n){
next = n;
}

Ejemplo: [ 25, 1, 14, 4 ]

Al final de la lista
25

14

head

null

Manteniendo un orden
1

14

25

head

null

Al inicio de la lista
4

14

25

head

null

}
Franco Guidi Polanco (PUCV-EII)

09-03-2007

Insercin de elementos al final de la lista

Franco Guidi Polanco (PUCV-EII)

Caso 2 (general): la lista tiene al menos un


elemento

25

head

null

25

09-03-2007

1. ubicar ltimo nodo de la lista


(aqul cuya variable next
contiene null)
2. Instanciar el nuevo nodo
con el contenido indicado
3. Asignar el nuevo nodo a la
variable next del ltimo
nodo (asegurndose de que
la variable next del nuevo
nodo sea igual a null)

head

null

null
aux

public Lista{
...
public void agregarAlFinal(int dato){
...
head = new Nodo( dato, null );
...
}
...
}
Franco Guidi Polanco (PUCV-EII)

10

Insercin de elementos al final de la lista

Caso 1: la lista est vaca (variable head contiene


null)

head

09-03-2007

25

14

head

null
aux

11

Franco Guidi Polanco (PUCV-EII)

aux.setNext(new Nodo(dato, null));


09-03-2007

12

Insercin de elementos al final de la lista

Recorrido de la lista

Caso general:

Mtodo que imprime el contenido de la lista:

public class Lista{


...
public void agregarAlFinal(int dato){
Nodo nuevo = new Nodo(dato, null);
if( head == null )
head = nuevo;
else{
Nodo aux = head;
while( aux.getNext() != null)
aux = aux.getNext();
aux.setNext( nuevo );
}

public class Lista{


...
public void imprimirContenido(){
Nodo aux = head;
while( aux != null ){
System.out.print( aux.getData() + "; " );
aux = aux.getNext();
}
System.out.println();
...

...
}
Franco Guidi Polanco (PUCV-EII)

09-03-2007

13

Bsqueda en la lista

Franco Guidi Polanco (PUCV-EII)

09-03-2007

14

Eliminacin de un elemento

Retorna true si el elemento est contenido en la


lista

Requiere identificar el nodo a borrar.


Caso 1: es el primer nodo de la lista

public class Lista{


...
public boolean estaContenido(int data){
Nodo aux = head;
while( aux != null ){
if( data == aux.getData() )
return true;
aux = aux.getNext();
}
return false;

25

14

head

null
head = head.getNext();
25

14

head
Sin otras referencias: candidato a eliminacin
(recolector de basura de Java)

null

...
1

Franco Guidi Polanco (PUCV-EII)

14

head
09-03-2007

15

Franco Guidi Polanco (PUCV-EII)

null
09-03-2007

16

Eliminacin de un elemento

Eliminacin de un elemento

Caso 2 (general): no es el primer nodo de la lista

25

14

head

null
aux.setNext(aux.getNext().getNext());

aux

25

14

head
Sin otras referencias: candidato a eliminacin
(recolector de basura de Java)
25

head
Franco Guidi Polanco (PUCV-EII)

null

null
09-03-2007

17

Simplificacin del esquema propuesto: uso de un


nodo fantasma
En el esquema propuesto se deben hacer
excepciones al insertar y eliminar el nodo del
comienzo de la lista.

public class Lista{


...
public boolean eliminar(int data){
if( head != null)
if( head.getData() == data ){
head = head.getNext();
return true;
}else{
Nodo aux = head;
while( aux.getNext() != null ){
if( aux.getNext().getData() == data ){
aux.setNext( aux.getNext().getNext() );
return true;
}
aux = aux.getNext();
}
}
return false;
}
...
}
Franco Guidi Polanco (PUCV-EII)

09-03-2007

Lista simplemente enlazada con nodo fantasma

Lista vaca:

public class Lista{


Nodo head;
public Lista(){
head = new Nodo(0, null);
}

head

El manejo se simplifica si se utiliza un nodo


fantasma:

18

...

null

Lista con elementos:

Es un nodo siempre presente en la lista


Su contenido es irrelevante (el valor u
objeto contenido no forma parte de la lista).

Valor irrelevante
25

head

null
Primer elemento de la lista

Franco Guidi Polanco (PUCV-EII)

09-03-2007

19

Franco Guidi Polanco (PUCV-EII)

09-03-2007

20

Eliminacin del primer elemento en la lista con nodo


fantasma

Operacin de insercin en la lista con nodo fantasma

La insercin del primer elemento de la lista entra


en el caso general:

La eliminacin del primer elemento de la lista entra


en el caso general:

head

null

aux

aux

aux.setNext(aux.getNext().getNext());

aux.setNext(new Nodo(dato, null));


14

public void agregarAlFinal(int dato){


Nodo aux = head;
while( aux.getNext() != null)
aux = aux.getNext();
aux.setNext( new Nodo(dato, null) );
}

Clase
Lista

head

null
Sin otras referencias: candidato a eliminacin
(recolector de basura de Java)

}
Franco Guidi Polanco (PUCV-EII)

09-03-2007

21

Eliminacin del primer elemento en la lista con nodo


fantasma (cont.)

Franco Guidi Polanco (PUCV-EII)

09-03-2007

22

Mejora al procedimiento de insercin de elementos al final


de la lista
El procedimiento descrito anteriormente requiere que todas
las veces sea encontrado el ltimo elemento de la lista.
Ms conveniente: tener una variable de instancia que
siempre referencie al ltimo elemento de la lista.

public boolean eliminar(int data){


Nodo aux = head;
while( aux.getNext() != null ){
if( aux.getNext().getData() == data ){
aux.setNext( aux.getNext().getNext() );
return true;
}
aux = aux.getNext();
}

Esto aplica a listas con o sin nodo fantasma (con pequeos


cambios).

return false;
}

Franco Guidi Polanco (PUCV-EII)

09-03-2007

23

Franco Guidi Polanco (PUCV-EII)

09-03-2007

24

Mejora al procedimiento de insercin de


elementos al final de la lista (cont.)

Mejora al procedimiento de insercin de elementos al final


de la lista (cont.)
La variable de instancia tail mantiene siempre la
referencia al ltimo elemento:

Diagrama de clases:
Lista

1..1

agregarAlFinal(d:Data)
estContenido(d:Data)
eliminar(d:Data):boolean
imprimirContenido()

head
1..1

1..1
tail

Nodo
data: int
getData():Data
setNext(n:Nodo)
getNext():Nodo
Nodo(d:Data,n:Nodo)

head

null

public class Lista{


Nodo head, tail;
public Lista(){
head = new Nodo(0, null);
tail = head;
}

tail

...
}

Diagrama de objetos:
Lista

head

25

ghost:Nodo

1stNode:Nodo

2ndNode:Nodo

data = 20

data = -1

09-03-2007

25

Mejora al procedimiento de insercin de elementos al final


de la lista (cont.)
El mtodo agregarAlFinal ya no requiere recorrer la
lista para ubicar el ltimo nodo:
public void agregarAlFinal(int dato){
Nodo aux = new Nodo(dato, null) ;
tail.setNext( aux );
tail = aux;

Versin con
nodo fantasma

Franco Guidi Polanco (PUCV-EII)

09-03-2007

26

Insercin en orden/al inicio

que recibe un entero y lo agrega en orden


ascendente a la lista.
Ejercicio 2: implemente el mtodo
agregarAlInicio(int dato)
que recibe un entero y lo agrega como
primer elemento.

La varaible tail es actualizada despus de la insercin.


Notar que el procedimiento de eliminacin debe actualizar
la referencia tail si se remueve el ltimo nodo de la lista.

09-03-2007

null

Ejercicio 1: implemente el mtodo:


agregarEnOrden(int dato)

Franco Guidi Polanco (PUCV-EII)

tail

tail
Franco Guidi Polanco (PUCV-EII)

head

27

Franco Guidi Polanco (PUCV-EII)

09-03-2007

28

Resumen listas simplemente enlazadas

Listas doblemente enlazadas

tiles para guardar un nmero no predefinido de


elementos.
Distintas disciplinas para mantener los datos
ordenados (y para removerlos).
El acceso a los nodos es secuencial; el recorrido es
en una sola direccin (Ejercicio: confrontar con
arreglos)

Estn diseadas para un acceso fcil al nodo siguiente y al


anterior.
Cada nodo contiene dos referencias: una apuntando al nodo
siguiente, y otra apuntando al nodo anterior.
El acceso a los nodos sigue siendo secuencial.
La tcnica del nodo fantasma puede ser til tambin en este
tipo de lista.

14

head

null
null
Franco Guidi Polanco (PUCV-EII)

09-03-2007

29

Franco Guidi Polanco (PUCV-EII)

09-03-2007

Comentarios finales sobre estructuras elementales


Estar abierto a definir y utilizar otras estructuras.
Ejemplo: Lista simplemente enlazada y circular
Colecciones implementadas sobre estructuras
bsicas
25

14

Franco Guidi Polanco

head

Escuela de Ingeniera Industrial


Pontificia Universidad Catlica de Valparaso, Chile
fguidi@ucv.cl

Franco Guidi Polanco (PUCV-EII)

09-03-2007

31

30

Interfaces versus implementacin

Listas
Representa una coleccin conformada por una secuencia finita y
ordenada de datos denominados elementos.
Ordenada implica que cada elemento tiene una posicin.
Los elementos corresponden a un tipo de dato.
La lista est vaca cuando no contiene elementos.
El nmero de elementos se denomina largo de la lista.
El comienzo de la lista es llamado cabeza (head), y el final cola
(tail).
Notacin: (a1, a2, ..., an).

En la seccin anterior estudiamos estructuras elementales


para implementar colecciones.
En esta seccin estudiaremos colecciones clsicas, desde
dos perspectivas:
La interfaz de la coleccin (cmo se utiliza)
La implementacin de la coleccin (cmo se construye)

Una misma interfaz puede ser soportada por mltiples


implementaciones
La eficiencia en la operacin de una coleccin va a
depender de su implementacin

Franco Guidi Polanco (PUCV-EII)

09-03-2007

33

Lista: versin clsica

Estudiaremos dos extremos:

La lista provee operaciones para:

Interfaz elemental
Interfaz extendida

Cambiar (modificar la referencia) del dato actual


Retornar el dato actual
Eliminar el dato actual
Modificar el dato actual
Insertar un dato en la posicin del dato actual
Borrar toda la lista, buscar elementos en la lista, contar
sus elementos
09-03-2007

34

No hay una nica definicin formal de interfaz.

(12, 22, 50, 30).

Franco Guidi Polanco (PUCV-EII)

09-03-2007

Interfaces para la versin clsica de la lista

Adems de los datos, el estado de la lista contiene


una identificacin (referencia) al dato actual.

Franco Guidi Polanco (PUCV-EII)

35

Franco Guidi Polanco (PUCV-EII)

09-03-2007

36

Interfaz elemental para la lista clsica

Ejemplo de uso de una lista (versin clsica)


Sea la siguiente lista:

public interface List {


public void clear();
//
public void insert(Object item); //
public Object remove();
//
public void setFirst();
//
public void next();
//
public int length();
//
public void setValue(Object val);//
public Object currValue();
//
public boolean isEmpty();
//
public boolean eol();
//
public String toString();
//
}

Elimina todos los elem.


Inserta elem. en act.
Saca/retorna elem.
Setea act. en 1ra pos.
Mueve act. a sig. pos.
Retorna largo
Setea elemento
Retorna elemento
True: lista vaca
True: act en end of list
Retorna lista de elem.

Operaciones:

miLista.insert(99) :
miLista=(12, 99, 22, 50, 30)
miLista.next():
Dato actual

miLista=(12, 99, 22, 50, 30)


Dato actual

Nota: pos.=posicin; act.=posicin actual; sig.:siguiente; prev.:previa


Franco Guidi Polanco (PUCV-EII)

09-03-2007

37

Ejemplo de uso de una lista (versin clsica)

miLista.remove():

22

miLista.setFirst():

miLista=(12, 99, 50, 30)


Dato actual
09-03-2007

09-03-2007

public interface ExtendedList {


public void clear();
//
public void insert(Object item); //
public void append(Object item); //
public Object remove();
//
public void setFirst();
//
public void next();
//
public void prev();
//
public int length();
//
public void setPos(int pos);
//
public void setValue(Object val);//
public Object currValue();
//
public boolean isEmpty();
//
public boolean eol();
//
public String toString();
//
}

miLista=(12, 99, 22, 50, 30)


Dato actual
22

Franco Guidi Polanco (PUCV-EII)

Franco Guidi Polanco (PUCV-EII)

38

Interfaz extendida para la lista clsica

miLista.currValue():

miLista=(12, 99, 50, 30)


(Nuevo) dato actual

miLista=(12, 22, 50, 30)


Dato actual

Elimina todos los elem.


Inserta elem. en act.
Agrega elem. al final
Saca/retorna elem.
Setea act. en 1ra pos.
Mueve act. a sig. pos.
Mueve act. a pos. prev.
Retorna largo
Setea act. a pos
Setea elemento
Retorna elemento
True: lista vaca
True: act en end of list
Retorna lista de elem.

Nota: pos.=posicin; act.=posicin actual; sig.:siguiente; prev.:previa


39

Franco Guidi Polanco (PUCV-EII)

09-03-2007

40

Implementacin de la lista clsica basada en


arreglos

Implementacin de la lista clsica


La conveniencia de una u otra implementacin depende de
las operaciones definidas en la interfaz.
Interfaz elemental:
Implementacin basada en lista simplemente enlazada
Implementacin basada en arreglos
Implementacin basada en lista doblemente enlazada
(sobredimensionada)

Interfaz extendida:
Implementacin basada en arreglos
Implementacin basada en lista doblemente enlazada
Implementacin basada en lista simplemente enlazada

Franco Guidi Polanco (PUCV-EII)

09-03-2007

41

Insercin en lista basada en arreglos

13 12 20
5

(a)

09-03-2007

42

Las listas basadas en arreglos tienen la desventaja


de que su nmero de elementos debe ser
predeterminado.
Cuando estas listas tienen pocos elementos, se
desperdicia espacio.
Las listas enlazadas no tienen lmite de nmero
mximo de elementos (mientras la memoria lo
permita).

(b)

23 13 12 20

Franco Guidi Polanco (PUCV-EII)

Comparacin entre implementaciones de listas

Insertar 23

13 12 20

Usa un arreglo para almacenar los elementos de la


lista.
Los elementos son almacenados en posiciones
contiguas en el arreglo.
El elemento i de la lista se almacena en la celda
i-1 del arreglo.
La cabeza de la lista siempre est en la primera
posicin del arreglo (0).
El mximo nmero de elementos en la lista se
define al crear el arreglo.

(c)
Franco Guidi Polanco (PUCV-EII)

09-03-2007

43

Franco Guidi Polanco (PUCV-EII)

09-03-2007

44

Comparacin entre implementaciones de listas

Uso de listas

Las listas basadas en arreglos son ms rpidas que


aquellas basadas en listas enlazadas para el
acceso aleatorio por posicin.
Las operaciones de insercin y eliminacin son
ms rpidas en las listas enlazadas.
En general, si el nmero de elementos que
contendr una lista es muy variable o desconocido,
es mejor usar listas enlazadas.

Franco Guidi Polanco (PUCV-EII)

09-03-2007

45

Uso de listas (cont.)

...
List lista = new LList(); // Implementacin seleccionada
lista.insert( Hola );
lista.insert( chao );
lista.setFirst();
while( !lista.eol() ){
System.out.println( (Sring)lista.currValue());
lista.next();
}
lista.setFirst();
String eliminado = (String) lista.remove()
...
Franco Guidi Polanco (PUCV-EII)

09-03-2007

46

Es un tipo restringido de lista, en donde los


elementos slo pueden ser insertados o removidos
desde un extremo, llamado top.
Se le llama tambin Stack o Lista LIFO (Last In,
First Out).
La operacin para insertar un nuevo elemento se
denomina push.
La operacin para remover un elemento se denomina
pop.

...
List lista = new AList(); // Implementacin seleccionada
lista.insert( Hola );
lista.insert( chao );
lista.setFirst();
while( !lista.eol() ){
System.out.println( (Sring)lista.currValue());
lista.next();
}
lista.setFirst();
String eliminado = (String) lista.remove()
...
09-03-2007

Referenciamos la lista por medio de su interfaz:

Pilas

Si en el programa anterior ahora se desea utilizar otra


implementacin de lista, slo debe cambiarse la clase a
instanciar.

Franco Guidi Polanco (PUCV-EII)

Supongamos las siguientes implementaciones de la lista:


LList, implementa List mediante una lista
simplemente enlazada
AList, implementa List mediante un arreglo

47

Franco Guidi Polanco (PUCV-EII)

09-03-2007

48

Interfaz para la Pila

Ejemplo de uso de una pila


pila.push(4):

public interface Stack {


public void clear();
// Remueve todos los objetos
public void push(Object it); // Agrega objeto al tope
public Object pop();
// Saca objeto del tope
public Object topValue();// Retorna objeto en el tope
public boolean isEmpty();
// True: pila vaca
}

pila.push(14):

pila.push(1):

Franco Guidi Polanco (PUCV-EII)

09-03-2007

49

Implementacin de una pila mediante lista


simplemente enlazada
top

pila.push(4)
4

top

pila.push(14)
14

14
4

Franco Guidi Polanco (PUCV-EII)

top
(nuevo)

09-03-2007

50

top=4

En esta clase, por conveniencia, se usa una


variable top, que siempre est 1 posicin ms
adelante del elemento superior de la pila.

null
4

top

Implementacin de una pila mediante un arreglo

Se inserta y remueve
siempre el primer
elemento:
no se requiere nodo
fantasma

null

pila.pop():
top

1
14
4

top

14
4

top

null

pila.pop()
4

top
Franco Guidi Polanco (PUCV-EII)

null
09-03-2007

51

Franco Guidi Polanco (PUCV-EII)

09-03-2007

52

Ejercicio pilas

Colas

Proponga implementaciones de la pila:

Es un tipo restringido de lista, en donde los


elementos slo pueden ser agregados al final, y
removidos por el frente.
Se le llama tambin Queue o Lista FIFO (First In,
First Out).
La operacin para agregar un nuevo elemento se
denomina enqueue.
La operacin para remover un elemento se denomina
dequeue.

Basada en un arreglo
Basada en una lista simplemente enlazada

Franco Guidi Polanco (PUCV-EII)

09-03-2007

53

Interfaz para la Cola

Franco Guidi Polanco (PUCV-EII)

09-03-2007

54

Ejemplo de uso de una cola


cola.enqueue( 20 )

cola=(20)

public interface Queue {


public void clear(); // Remueve todos los objetos
public void enqueue(Object it);// Agrega obj. al final
public Object dequeue(); // Saca objeto del frente
public Object firstValue(); // Retorna obj. del frente
public boolean isEmpty(); // Retorna V si cola vaca
}

cola.enqueue( 15 )

cola=(20, 15)
cola.enqueue( 40 )

cola=(20, 15, 40)


cola.dequeue()

cola=(15, 40)
cola.dequeue()

20

cola=(40)
15
Franco Guidi Polanco (PUCV-EII)

09-03-2007

55

Franco Guidi Polanco (PUCV-EII)

09-03-2007

56

Cola basada en arreglos (cont.)

Cola basada en lista simplemente enlazada

Aproximacin simple: almacenar los n elementos de


la cola en las n primeras posiciones del arreglo.
25

rear=3

null

front

rear

Sacar del frente:

Es conveniente mantener una referencia al ltimo


elemento de la cola (facilita operacin enqueue).

rear=2

Problema: lentitud de procedimiento dequeue (sacar


primer elemento).
Franco Guidi Polanco (PUCV-EII)

09-03-2007

57

Cola basada en arreglos (cont.)

09-03-2007

Arreglo circular: Pretender que el arreglo es circular, y


permitir que la cola contine directamente de la ltima
posicin del arreglo a la primera.

rear=3
front=0

Sacar del frente:

5
front=1 rear=3

09-03-2007

Problema: Al sacar y agregar elementos, rear llega a la ltima


posicin del arreglo y la cola no puede crecer, aun cuando existan
posiciones libres al comienzo.
Franco Guidi Polanco (PUCV-EII)

58

Cola basada en arreglos* (cont.)

Aproximacin mejorada: al hacer dequeue, no


desplazar elementos, sino asumir que el frente de la
cola se desplaza.
front=0

Franco Guidi Polanco (PUCV-EII)

Funcin de avance
Dados:
pos: posicin actual
size: tamao arreglo
pos=(pos+1);
if (pos>=size)
pos=0;

rear=3
4

59

Franco Guidi Polanco (PUCV-EII)

09-03-2007

60

Cola basada en arreglos* (cont.)

Cola basada en arreglos* (cont.)

Problema de arreglo circular:


Si front es igual a rear, implica que hay 1 elemento.
Luego, rear est una posicin detrs de front implica que la cola
est vaca.
Pero si la cola est llena, rear tambin est una posicin detrs de
front.
Problema: Cmo reconocer cuando una cola est vaca o llena?
Solucin: Usar un arreglo de n posiciones, para almacenar como
mximo n-1 elementos.

Franco Guidi Polanco (PUCV-EII)

09-03-2007

61

Por conveniencia, se usa una variable front para


apuntar a la posicin precedente al elemento
frontal.
La cola est vaca cuando front=rear.
La cola est llena cuando rear est justo detrs
de front, o sea cuando la funcin de avance
indica que de aumentar rear en 1, se llegara a
front.

Franco Guidi Polanco (PUCV-EII)

09-03-2007

62

Das könnte Ihnen auch gefallen