Documente Academic
Documente Profesional
Documente Cultură
1. Introduccin 2. Estructuras de datos lineales 3. Estructuras de datos jerrquicas 4. Grafos y caminos 5. Implementacin de listas, colas y pilas 6. Implementacin de mapas, rboles y grafos
UNIVERSIDAD DE CANTABRIA
UNIVERSIDAD DE CANTABRIA
5.1. Introduccin
UNIVERSIDAD DE CANTABRIA
Motivos para crear estructuras de datos propias persistente: estructura de datos que reside en disco especficas de la aplicacin: por ejemplo, mapa con elementos no modificables, adaptacin a los datos concretos de la aplicacin optimizadas: en tiempo de ejecucin o en espacio funcionalidad extra: por ejemplo ordenacin especial, ... comodidad: por ejemplo dar implementaciones ms simples o en otros idiomas, ... adaptacin de otras estructuras ya realizadas
UNIVERSIDAD DE CANTABRIA
En las colecciones java se definen implementaciones de clases abstractas pensadas para facilitar la creacin de estructuras de datos propias implementan parte de los mtodos, para ahorrar trabajo
- estos mtodos se pueden redefinir si se cree conveniente
Las clases abstractas que se proporcionan son AbstractCollection una Coleccin que no es ni un Conjunto ni una Lista
- como mnimo hay que proporcionar el iterador y el mtodo size
AbstractSet un Conjunto;
- como mnimo hay que proporcionar el iterador y el mtodo size
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
UNIVERSIDAD DE CANTABRIA
AbstractSequentialList una lista en la que los elementos se guardan en una estructura de datos secuencial (por ejemplo una lista enlazada)
- como mnimo hay que proporcionar el iterador de lista y el mtodo size - la clase abstracta proporciona los mtodos posicionales
UNIVERSIDAD DE CANTABRIA
- como mnimo hay que proporcionar offer, peek, poll, y size y un iterador que soporte remove
AbstractMap un Mapa
- como mnimo hay que proporcionar la vista entrySet - habitualmente esto se hace con la clase AbstractSet - si el mapa es modificable, como mnimo hay que proporcionar el mtodo put
UNIVERSIDAD DE CANTABRIA
1. Elegir la clase abstracta apropiada 2. Proporcionar implementaciones para los mtodos abstractos 3. Si la coleccin es modificable, ser necesario redefinir tambin algunos mtodos concretos
- El manual nos describe lo que hace cada uno
UNIVERSIDAD DE CANTABRIA
En muchas estructuras de datos es preciso establecer relaciones o referencias entre diferentes datos ahorran espacio al no repetir datos evitan inconsistencias Si los datos estn en un array, se pueden utilizar cursores el cursor es un entero que indica el nmero de la casilla del array donde est el dato Si la lista de alumnos no es un array deben utilizarse referencias o punteros (si los soporta el lenguaje de programacin) son datos especiales que sirven para apuntar o referirse a otros datos
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
UNIVERSIDAD DE CANTABRIA
UNIVERSIDAD DE CANTABRIA
10
Punteros
Las referencias, tambin llamadas punteros o tipos acceso, proporcionan acceso a otros objetos de datos
UNIVERSIDAD DE CANTABRIA
En Java, todos los objetos y arrays se usan a travs de referencias las variables de los tipos primitivos no
- enteros, reales, caracteres, booleanos
pero tienen clases asociadas que permiten usar estos datos como objetos
- ej., Integer, Double, Boolean, Character
Hay un valor predefinido, null, que es el valor por omisin, y no se refiere a ningn dato
11
UNIVERSIDAD DE CANTABRIA
Las referencias son tiles cuando se usan para crear estructuras de datos con relaciones entre objetos Por ejemplo, una lista enlazada
Contenido A1 Celda Prximo A2 ... An
cada elemento tiene un contenido y un puntero al prximo el ltimo tiene un puntero prximo nulo
12
UNIVERSIDAD DE CANTABRIA
Diferencias con el array: los arrays tienen tamao fijo: ocupan lo mismo, incluso medio vacos con estructuras de datos dinmicas se gasta slo lo preciso pero se necesita espacio para guardar los punteros
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
13
UNIVERSIDAD DE CANTABRIA
La lista se representa mediante un array en el que cada casilla almacena un elemento, y los elementos se ordenan segn el ndice de la casilla
Elementos 0 1 ultimo Primer Elemento Segundo Elemento Lista ... ltimo Elemento ... length-1
Vaco
14
UNIVERSIDAD DE CANTABRIA
Cuando la lista est llena y se intenta aadir un nuevo elemento lista acotada: indicar un error lista ilimitada: cambiar el tamao del array El cambio de tamao directo no es posible en Java ni en la mayora de los lenguajes crear un nuevo array (por ejemplo del doble de tamao) copiar todos los elementos en el nuevo array
- en el momento del cambio - o poco a poco, en sucesivas operaciones (amortizacin)
15
UNIVERSIDAD DE CANTABRIA
- mover las casillas en el rango [i,ultimo] una casilla hacia adelante, yendo desde el final al principio
16
UNIVERSIDAD DE CANTABRIA
- mover las casillas en el rango [i+1,ultimo] una casilla hacia atrs, yendo del principio hacia el final
decrementar el cursor ultimo retornar la variable con el elemento borrado Iterador se implementa con un cursor que apunta al elemento prximo
17
UNIVERSIDAD DE CANTABRIA
Queremos implementar algo similar al ArrayList, pero que no cambie de tamao si no cabe un elemento puede ser til en sistemas con listas de tamao limitado o en sistemas de tiempo de respuesta predecible
- sistemas de tiempo real
si se excede el tamao es por un error: conviene indicarlo En las colecciones Java disponemos de clases abstractas que facilitan la implementacin de las diferentes interfaces
18
UNIVERSIDAD DE CANTABRIA
19
UNIVERSIDAD DE CANTABRIA
/** * Constructor.Se le pasa tamao mximo de la lista */ public ListaArrayAcotada(int max) { lista=(E[]) new Object[max]; ultimo=-1; } /** * Constructor que crea la lista con un tamao igual * a maxPorOmision */ public ListaArrayAcotada() { this(maxPorOmision); }
20
UNIVERSIDAD DE CANTABRIA
/** * Constructor. Se le pasa coleccin para copiarla */ public ListaArrayAcotada(Collection<E> c) { // crea la lista del tamao de la coleccin this(c.size()); // anade todos los elementos a la lista for (E e:c) { add(ultimo+1,e); } }
21
UNIVERSIDAD DE CANTABRIA
22
UNIVERSIDAD DE CANTABRIA
23
UNIVERSIDAD DE CANTABRIA
/** * Aadir posicional: add * Lanza IndexOutOfBoundsException si el indice es * incorrecto; Lanza IllegalStateException si el * elemento no cabe */ public void add(int indice, E elemento) { // comprueba errores if (indice>ultimo+1) { throw new IndexOutOfBoundsException(); } if (ultimo==lista.length-1) { throw new IllegalStateException(); }
24
UNIVERSIDAD DE CANTABRIA
25
UNIVERSIDAD DE CANTABRIA
/** * Borrar posicional. Si el indice es incorrecto * Lanza IndexOutOfBoundsException */ public E remove(int indice) { if (indice>ultimo) { throw new IndexOutOfBoundsException(); } E borrado=lista[indice]; // desplaza elementos hacia atrs for (int i=indice+1; i<=ultimo; i++) { lista[i-1]=lista[i]; } ultimo--; return borrado; }
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
26
UNIVERSIDAD DE CANTABRIA
27
UNIVERSIDAD DE CANTABRIA
Vaco
28
UNIVERSIDAD DE CANTABRIA
29
UNIVERSIDAD DE CANTABRIA
30
UNIVERSIDAD DE CANTABRIA
import java.util.*; /** * Pila implementada mediante un array simple */ public class PilaArraySimple<E> implements Pila<E> { public static int maxPorOmision=50; // atributos de la pila private E[] contenido; private int cima; /** * Constructor que crea una pila vaca cuyo * tamano es maxPorOmision */
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
31
UNIVERSIDAD DE CANTABRIA
32
UNIVERSIDAD DE CANTABRIA
/** * Apilar un elemento * Lanza IllegalStateException si est llena */ public void apila(E e) { if (estaLlena()) { throw new IllegalStateException(); } cima++; contenido[cima]=e; }
33
UNIVERSIDAD DE CANTABRIA
/** * Desapilar un elemento */ public E desapila() throws NoSuchElementException { if (estaVacia()) { throw new NoSuchElementException(); } cima--; return contenido[cima+1]; }
34
UNIVERSIDAD DE CANTABRIA
/** * Retornar el elem. de la cima, sin desapilarlo */ public E cima() throws NoSuchElementException { if (cima==-1) { throw new NoSuchElementException(); } else { return contenido[cima]; } }
35
UNIVERSIDAD DE CANTABRIA
36
UNIVERSIDAD DE CANTABRIA
/** * Retornar el numero de elementos en la pila */ public int tamano() { return cima+1; } }
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
37
UNIVERSIDAD DE CANTABRIA
...
...
contenido an an-1
...
a1 a2
fin
principio
38
UNIVERSIDAD DE CANTABRIA
Array circular contenido: es un array lineal en el que se considera que el elemento siguiente al ltimo es el primero Cursores principio: primer elemento fin: ltimo elemento Almacenamiento de la situacin de cola vaca dejando siempre al menos un hueco vaco, para distinguir la cola llena de la cola vaca o almacenando el nmero de elementos, o un booleano que diga si la cola est vaca o no
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
39
UNIVERSIDAD DE CANTABRIA
40
UNIVERSIDAD DE CANTABRIA
41
Iterador de la cola
El iterador es un cursor al elemento siguiente siguiente: avanzar (circularmente) el cursor siguiente hay siguiente: es falso si el cursor est despus del final de la cola
UNIVERSIDAD DE CANTABRIA
borrar: lo dejaremos sin implementar, ya que el borrado en mitad de la cola sera muy poco eficiente
42
UNIVERSIDAD DE CANTABRIA
/** * Clase que representa una cola implementada mediante * un array circular */ public class ColaCircular<E> extends AbstractQueue<E> { public static int maxPorOmision=50; // atributos de la cola private E[] contenido; private int principio,fin;
43
UNIVERSIDAD DE CANTABRIA
44
UNIVERSIDAD DE CANTABRIA
/** * Constructor que crea una cola cuyos elementos * obtiene de la coleccin que se le pasa */
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
45
UNIVERSIDAD DE CANTABRIA
46
UNIVERSIDAD DE CANTABRIA
/** * Aade un elem. a la cola; retorna false si no cabe * y true si cabe; no admite elementos nulos */ public boolean offer(E e) { if (isFull() || e==null) { return false; } else { fin=incr(fin,1); contenido[fin]=e; return true; } }
47
UNIVERSIDAD DE CANTABRIA
48
UNIVERSIDAD DE CANTABRIA
/** * Retorna el primer elem. de la cola sin eliminarlo * retorna null si no hay elementos */ public E peek() { if (isEmpty()) { return null; } else { return contenido[principio]; } }
49
UNIVERSIDAD DE CANTABRIA
50
UNIVERSIDAD DE CANTABRIA
51
UNIVERSIDAD DE CANTABRIA
/** * Constructor al que se le pasa la cola * No es pblico, para que se use el metodo * iterator() al crearlo */ ColaCircularIterator(ColaCircular<E> cola) { this.cola=cola; siguiente=cola.principio; }
52
UNIVERSIDAD DE CANTABRIA
53
UNIVERSIDAD DE CANTABRIA
/** * Indicar si hay elemento siguiente */ public boolean hasNext() { return ! (cola.incr(cola.fin,1)==siguiente); } /** * Borra no se implementa por poco eficiente */ public void remove() { throw new UnsupportedOperationException(); } } // fin de la clase iterador
54
UNIVERSIDAD DE CANTABRIA
55
UNIVERSIDAD DE CANTABRIA
a1
a2
...
an
principio lista
el primer elemento (cabecera) est vaco la lista contiene un puntero (principio) a la cabecera
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
56
UNIVERSIDAD DE CANTABRIA
El iterador de la lista contiene previo: un puntero al elemento previo antUltAcc: un puntero al elemento anterior al ltimo elemento accedido a travs del iterador (con proximo o previo)
Cabecera Celdas
a1
a2
...
an
principio lista
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
antUltAcc
previo iterador
57
UNIVERSIDAD DE CANTABRIA
a1
a2
...
an
58
UNIVERSIDAD DE CANTABRIA
...
59
UNIVERSIDAD DE CANTABRIA
60
Diagrama de aade
a) antes de aadir a
...
UNIVERSIDAD DE CANTABRIA
b prximo
...
previo
b prximo
...
x previo
Michael Gonzlez Harbour 17/nov/09 61
UNIVERSIDAD DE CANTABRIA
62
UNIVERSIDAD DE CANTABRIA
63
UNIVERSIDAD DE CANTABRIA
fijo O(n) O(n) O(n) O(1) O(1) O(1) O(1) O(1) O(1)
Michael Gonzlez Harbour 17/nov/09
UNIVERSIDAD DE CANTABRIA
65
UNIVERSIDAD DE CANTABRIA
66
UNIVERSIDAD DE CANTABRIA
67
UNIVERSIDAD DE CANTABRIA
/** * Constructor que crea la lista vaca con los * elementos de la coleccin c */ public ListaEnlazadaSimple(Collection<E> c) { this(); Celda<E> actual=principio; for (E e:c) { actual.siguiente=new Celda<E>(e); actual=actual.siguiente; num++; } }
68
UNIVERSIDAD DE CANTABRIA
69
UNIVERSIDAD DE CANTABRIA
70
UNIVERSIDAD DE CANTABRIA
71
UNIVERSIDAD DE CANTABRIA
72
UNIVERSIDAD DE CANTABRIA
73
UNIVERSIDAD DE CANTABRIA
/** * Obtiene el siguiente y avanza el iterador */ public E next() { if (hasNext()) { antUltAcc=previo; previo=previo.siguiente; return previo.contenido; } else { throw new NoSuchElementException(); } } /** * Obtiene elem. previo y retrocede el iterador */
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
74
UNIVERSIDAD DE CANTABRIA
public E previous() { if (hasPrevious()) { E cont=previo.contenido; // buscar el elemento anterior al previo Celda<E> anterior=lista.principio; while (anterior.siguiente!=previo) { anterior=anterior.siguiente; } previo=anterior; antUltAcc=previo; return cont; } else { throw new NoSuchElementException(); } }
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
75
UNIVERSIDAD DE CANTABRIA
76
UNIVERSIDAD DE CANTABRIA
77
UNIVERSIDAD DE CANTABRIA
/** * Borra el ultimo elemento accedido */ public void remove() { if (antUltAcc!=null) { Celda<E> borrar=antUltAcc.siguiente; antUltAcc.siguiente=borrar.siguiente; if (previo==borrar) { previo=antUltAcc; } antUltAcc=null; lista.num--; } else { throw new IllegalStateException(); } }
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
78
UNIVERSIDAD DE CANTABRIA
79
UNIVERSIDAD DE CANTABRIA
/** * Anade un elem. entre el previo y el proximo */ public void add(E e) { Celda<E> nueva=new Celda<E>(e); nueva.siguiente=previo.siguiente; previo.siguiente=nueva; previo=nueva; antUltAcc=null; lista.num++; } } // fin de la clase iteradora
80
UNIVERSIDAD DE CANTABRIA
81
UNIVERSIDAD DE CANTABRIA
/** * Retorna el iterador colocado * en la posicion i */ public ListIterator<E> listIterator(int i) { if (i>=0 && i<=size()) { return new IteradorListaEnlazada<E>(this,i); } else { throw new IndexOutOfBoundsException(); } } }
82
UNIVERSIDAD DE CANTABRIA
La cola tiene un puntero al principio y otro al final; los elementos se insertan por el final y se extraen por el principio
Elementos
a1
a2
...
an
83
UNIVERSIDAD DE CANTABRIA
an+1 nuevaCelda
84
UNIVERSIDAD DE CANTABRIA
b) Extraer
a1
a2
...
an
85
UNIVERSIDAD DE CANTABRIA
/** * Clase que representa una cola implementada mediante * una lista enlazada */ public class ColaEnlazada<E> extends AbstractQueue<E> { // atributos de la cola private Celda<E> principio,fin; private int num; // clase privada que define la celda
86
UNIVERSIDAD DE CANTABRIA
87
UNIVERSIDAD DE CANTABRIA
/** * Constructor que crea una cola con los elementos * de la coleccin que se le pasa */ public ColaEnlazada(Collection<E> c) { // crea la cola vaca this(); // anade todos los elementos a la cola for (E e:c) { offer(e); } } /** * Anade elemento a la cola; retorna false si no cabe * y true en otro caso; no admite elementos nulos */
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
88
UNIVERSIDAD DE CANTABRIA
89
UNIVERSIDAD DE CANTABRIA
90
UNIVERSIDAD DE CANTABRIA
/** * Retorna el 1 elemento de la cola sin eliminarlo * retorna null si no hay elementos */ public E peek() { if (isEmpty()) { return null; } else { return principio.contenido; } }
91
UNIVERSIDAD DE CANTABRIA
92
UNIVERSIDAD DE CANTABRIA
93
UNIVERSIDAD DE CANTABRIA
/** * Obtener el proximo elem. y avanzar el iterador */ public E next() { if (hasNext()) { E sig=siguiente.contenido; siguiente=siguiente.siguiente; return sig; } else { throw new NoSuchElementException(); } }
94
UNIVERSIDAD DE CANTABRIA
/** * Borra no se implementa, por poco eficiente */ public void remove() { throw new UnsupportedOperationException(); } }
95
UNIVERSIDAD DE CANTABRIA
96
UNIVERSIDAD DE CANTABRIA
...
...
97
UNIVERSIDAD DE CANTABRIA
UNIVERSIDAD DE CANTABRIA
Antes de poder usar las listas es preciso poner todas las celdas en la lista de celdas libres Para inicializar una lista se reserva una celda cabecera vaca
1 2 3 4 5 6 7 8 9
prximo
99
Inicializacin
mtodo inicializa para i desde 0 hasta maxElem-2, paso -1 hacer proximo[i]:=i+1; fpara; libre:=0; proximo[maxElem-1]:=-1; // final de lista fmtodo Si las tablas son estticas, hay que asegurarse de que se inicializan antes de que otros objetos puedan usarlas En java se puede usar un inicializador esttico static { inicializa(); }
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
UNIVERSIDAD DE CANTABRIA
100
UNIVERSIDAD DE CANTABRIA
libre
101
Pedir Celda
mtodo pedirCelda(Elemento e) retorna entero begin var entero posicionCelda; fvar; si libre==-1 then lanza NoCabe; si no posicionCelda:=libre; libre:=proximo[libre]; proximo[posicionCelda]:=-1; contenido[posicionCelda]:=e; fsi; retorna posicionCelda; fmtodo;
UNIVERSIDAD DE CANTABRIA
102
UNIVERSIDAD DE CANTABRIA
posicionCelda ...
posicionCelda
103
Liberar Celda
mtodo liberarCelda (entero posicionCelda) proximo[posicionCelda]:=libre; libre:=posicionCelda; fmtodo
UNIVERSIDAD DE CANTABRIA
104
UNIVERSIDAD DE CANTABRIA
105
Iterador de la lista
UNIVERSIDAD DE CANTABRIA
El iterador de la lista es como en la lista enlazada con punteros: previo: un cursor al elemento previo antUltAcc: un cursor al elemento anterior al ltimo elemento accedido a travs del iterador (con proximo o previo)
Cabecera Celdas
a1
a2
...
an
principio lista
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
antUltAcc
previo iterador
106
UNIVERSIDAD DE CANTABRIA
import java.util.*; /** * Clase que representa una lista implementada con * una lista enlazada simple */ public class ListaCursores<E> extends AbstractSequentialList<E> { // Espacio para colocar las listas // se define con atributos estticos public static int maxElem=1000; private static int[] proximo=new int[maxElem]; private static Object[] contenido= new Object[maxElem]; private static int libre;
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
107
UNIVERSIDAD DE CANTABRIA
108
UNIVERSIDAD DE CANTABRIA
109
UNIVERSIDAD DE CANTABRIA
private static void liberarCelda(int posicionCelda) { proximo[posicionCelda]=libre; libre=posicionCelda; } // atributos privados private int principio; private int num;
110
UNIVERSIDAD DE CANTABRIA
/** * Constructor que crea la lista vaca con los * elementos de la coleccin c */
111
UNIVERSIDAD DE CANTABRIA
112
UNIVERSIDAD DE CANTABRIA
113
UNIVERSIDAD DE CANTABRIA
IteradorListaCursores(ListaCursores<E> lista) { this.lista=lista; previo=lista.principio; antUltAcc=-1; } /** Constructor del iterador; no es publico */ IteradorListaCursores(ListaCursores<E> lista, int i) { this(lista); for (int j=0; j<i; j++) { next(); } antUltAcc==-1; }
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
114
UNIVERSIDAD DE CANTABRIA
115
UNIVERSIDAD DE CANTABRIA
/** * Obtiene el siguiente y avanza el iterador */ public E next() { if (hasNext()) { antUltAcc=previo; previo=proximo[previo]; return (E) contenido[previo]; } else { throw new NoSuchElementException(); } } /** * Obtiene el elemento previo y retrocede */
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
116
UNIVERSIDAD DE CANTABRIA
public E previous() { if (hasPrevious()) { E cont=(E) contenido[previo]; // buscar el elemento anterior al previo int anterior=lista.principio; while (proximo[anterior]!=previo) { anterior=proximo[anterior]; } previo=anterior; antUltAcc=previo; return cont; } else { throw new NoSuchElementException(); } }
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
117
UNIVERSIDAD DE CANTABRIA
118
UNIVERSIDAD DE CANTABRIA
119
UNIVERSIDAD DE CANTABRIA
120
UNIVERSIDAD DE CANTABRIA
/** * Anade un nuevo e entre el previo y el proximo */ public void add(E e) { int nueva=pedirCelda(e); proximo[nueva]=proximo[previo]; proximo[previo]=nueva; previo=nueva; antUltAcc=-1; lista.num++; } }
121
UNIVERSIDAD DE CANTABRIA
122
UNIVERSIDAD DE CANTABRIA
/** * Metodo que retorna el iterador colocado * en la posicion i */ public ListIterator<E> listIterator(int i) { if (i>=0 && i<=size()) { return new IteradorListaCursores<E>(this,i); } else { throw new IndexOutOfBoundsException(); } } }
123
UNIVERSIDAD DE CANTABRIA
En las listas enlazadas simples, las operaciones para acceder a la posicin ltima y hacer retroceder al iterador son costosas (O(n)) Para evitar este problema se pueden hacer listas doblemente enlazadas:
Elementos
a1
a2
... ...
an
124
Iterador de la lista
UNIVERSIDAD DE CANTABRIA
El iterador de la lista contiene proximo: un puntero al elemento proximo ultAcc: un puntero al ltimo elemento accedido a travs del iterador (con proximo o previo)
... ...
a1
a2
an
ultAcc
proximo iterador
125
UNIVERSIDAD DE CANTABRIA
a1
a2
an
126
UNIVERSIDAD DE CANTABRIA
a1
a2
an
127
UNIVERSIDAD DE CANTABRIA
128
UNIVERSIDAD DE CANTABRIA
129
Diagrama de aade
a) situacin inicial a b c ...
UNIVERSIDAD DE CANTABRIA
...
ultAcc proximo iterador a b) despus de aade b c ...
a
nuevaCelda
Michael Gonzlez Harbour 17/nov/09 130
UNIVERSIDAD DE CANTABRIA
b) despus de borra
...
131
UNIVERSIDAD DE CANTABRIA
b) despus de borra
...
132
UNIVERSIDAD DE CANTABRIA
/** * Clase que representa una lista implementada con * una lista doblemente enlazada */ public class ListaDoblementeEnlazada<E> extends AbstractSequentialList<E> { // atributos privados private Celda<E> principio; private Celda<E> fin; private int num;
133
UNIVERSIDAD DE CANTABRIA
134
UNIVERSIDAD DE CANTABRIA
public ListaDoblementeEnlazada() { num=0; } /** * Constructor que crea la lista vaca con los * elementos de la coleccin c */ public ListaDoblementeEnlazada(Collection<E> c) { this(); for (E e:c) { add(e); // inserta al final } }
135
UNIVERSIDAD DE CANTABRIA
136
UNIVERSIDAD DE CANTABRIA
137
UNIVERSIDAD DE CANTABRIA
138
UNIVERSIDAD DE CANTABRIA
/* * Constructores del iterador; no son pblicos */ IteradorListaDoblementeEnlazada (ListaDoblementeEnlazada<E> lista) { this.lista=lista; proximo=lista.principio; }
139
UNIVERSIDAD DE CANTABRIA
IteradorListaDoblementeEnlazada (ListaDoblementeEnlazada<E> lista, int i) { this(lista); if (i==lista.num) { proximo=null; // nos ponemos al final } else { // este bucle se podra optimizar empezando // por el final si i>num/2 for (int j=0; j<i; j++) { next(); } ultAcc=null; } }
DEPARTAMENTO DE MATEMTICAS, ESTADSTICA Y COMPUTACIN
140
UNIVERSIDAD DE CANTABRIA
141
UNIVERSIDAD DE CANTABRIA
/** * Obtiene el siguiente y avanza el iterador */ public E next() { if (hasNext()) { ultAcc=proximo; proximo=proximo.siguiente; return ultAcc.contenido; } else { throw new NoSuchElementException(); } }
142
UNIVERSIDAD DE CANTABRIA
143
UNIVERSIDAD DE CANTABRIA
144
UNIVERSIDAD DE CANTABRIA
145
UNIVERSIDAD DE CANTABRIA
146
UNIVERSIDAD DE CANTABRIA
147
UNIVERSIDAD DE CANTABRIA
148
UNIVERSIDAD DE CANTABRIA
149
UNIVERSIDAD DE CANTABRIA
150
UNIVERSIDAD DE CANTABRIA
151
UNIVERSIDAD DE CANTABRIA
/** * Metodo que retorna el iterador */ public ListIterator<E> listIterator() { return new IteradorListaDoblementeEnlazada<E>(this); }
152
UNIVERSIDAD DE CANTABRIA
/** * Metodo que retorna el iterador colocado * en la posicion i */ public ListIterator<E> listIterator(int i) { if (i>=0 && i<=size()) { return new IteradorListaDoblementeEnlazada<E>(this,i); } else { throw new IndexOutOfBoundsException(); } } }
153
UNIVERSIDAD DE CANTABRIA
154