Está en la página 1de 3

lOMoARcPSD|3781593

Práctico - implementacion de una lista con pi

Estructuras de datos y algoritmos (Universitat Politecnica de Valencia)

StuDocu no está patrocinado ni avalado por ningún colegio o universidad.


Descargado por Santa De Los Niños (iei015@hotmail.com)
lOMoARcPSD|3781593

Implementación de Lista Con PI: la clase LEGListaConPI


Antes de diseñar una Implementación eficiente de una Lista Con Punto de Interés (PI) es importante
recordar que, al contrario de lo que ocurre en una Pila y una Cola, se pueden insertar y eliminar Datos en
cualquier punto de su estructura simplemente desplazando hasta él su PI. Ası́, la implementación de estas
operaciones sobre un array supone siempre un desplazamiento de Datos de coste directamente proporcio-
nal a la posición del PI de una Lista que descarta a-priori la Representación Contigua y eficaz de
esta EDA Lineal.
La única opción que resta entonces para obtener una Implementación eficiente de una Lista Con PI es
representarla mediante la Lista Enlazada; como obviamente una LEG resulta insuficiente para implementar
las operaciones recuperar() y fin() en Θ(1), la primera Representación Enlazada de una Lista Con PI
que tiene sentido intentar TIENE UN
NodoLEG<E> pri que apunta al primero de los Nodos de la LEG;
NodoLEG<E> ult que apunta al último de los Nodos de la LEG;
NodoLEG<E> pI que apunta al Nodo de la LEG que contiene el Dato que ocupa su PI.

Usando la Representación Enlazada propuesta, y siempre en Θ(1), se puede recuperar() el Dato sobre
el que se sitúa el PI de la Lista accediendo a pI.dato, se puede situar el PI en inicio() y fin() de Lista
mediante las instrucciones ✭✭pI= pri✮✮ y ✭✭pI=ult.siguiente✮✮ respectivamente y se puede implementar
esFin() evaluando la expresión ✭✭pI==ult.siguiente✮✮. Sin embargo, como para borrar el Nodo apuntado
por pI e insertar uno nuevo antes de él hay que disponer de un Enlace al que le precede, esta Representación
de Lista Con PI no permite insertar y eliminar en el orden de una constante; la siguiente figura
permite visualizar este problema para la inserción de un nuevo Nodo antes del referenciado por pI:
pri pI ult

11111
00000
00000
11111
00000
11111
... 00000
11111 ... null
00000
11111
00000
11111
¿?

x
nuevo

Para solucionar este problema de coste, i.e. para acceder al Nodo anterior al que apunta pI en Θ(1), la
única alternativa es substituir el Enlace pI de la Representación actual por el Enlace al Nodo
anterior al que apunta pI o, expresado en otros términos, representar el PI de una Lista mediante el
Enlace ant.siguiente. Ası́ por ejemplo, y como se ilustra en la figura adjunta, usando el Enlace ant el
código básico para insertar(x) serı́a el siguiente:
NodoLEG<E> nuevo = new NodoLEG<E>(x);
nuevo.siguiente = ant.siguiente; ant.siguiente = nuevo;
pri ant ult

ant.siguiente
00000
11111
00000
11111
... 00000
11111
00000
11111 ... null
00000
11111
00000
11111

x
nuevo

1
Descargado por Santa De Los Niños (iei015@hotmail.com)
lOMoARcPSD|3781593

Ahora bien, y como quizás se haya observado, la Representación Enlazada propuesta presenta un
problema: su Enlace ant no está definido en inicio de Lista. Para solucionarlo caben dos opciones,
ambas del mismo coste: desarrollar código especı́fico para borrar e insertar en inicio de Lista o añadir a la
Representación actual de Lista Con PI un primer Nodo Ficticio, o un Nodo Cabecera con dato = null, al
que siempre apunta pri. Al haberse optado en esta asignatura por la segunda opción, pues es más legible,
se deben explicitar ahora tres aspectos de la Representación Enlazada de una Lista Con PI mediante una
LEG con Nodo Cabecera Ficticio y tres Enlaces pri, ant y ult:

tan sólo en inicio de Lista pri == ant porque, como se observa en la siguiente figura, pri apunta al
Nodo Cabecera Ficticio de la LEG y no al que contiene el primer Dato de la Lista con PI.

pri ant ult

ant.siguiente
00000
11111 0
1
00000
11111 0
1
... 00000
11111 0
1 ...
null dato1 00000
11111
00000
11111 0
1 null
00000
11111 0
1

construir una Lista con PI vacı́a implica, como ilustra la siguiente figura, crear un Nodo Cabecera
que no contiene Dato alguno y al que que apuntan los Enlaces pri, ant y ult, i.e. implica ejecutar
la instrucción ✭✭pri = ult = ant = new NodoLEG<E>(null)✮✮.

pri ant ult

null null

considerando que los Enlaces pri, ant y ult pueden coincidir en el caso de Lista vacı́a pero que
pri y ant sólo coinciden cuando el PI de una Lista se sitúa en su inicio, ✭✭return pri == ult✮✮ y
✭✭ant = pri✮✮ son las intrucciones que implementan, respectivamente, las operaciones esVacia() e
inicio() de una Lista Con PI; asimismo, considerando que los únicos Enlaces que siempre coinciden
en fin de Lista son ult y ant, las instrucciones ✭✭ant = ult✮✮ y ✭✭return ant == ult✮✮ implementan
respectivamente sus operaciones fin() y esFin().

2
Descargado por Santa De Los Niños (iei015@hotmail.com)

También podría gustarte