ESTRUCTURAS DINAMICAS

18
 INTRODUCCION Hasta ahora teníamos una serie de variables que declaramos al principio del pr ograma o de cada fu nción. Estas va riables, qu e reciben el nombre de ESTÁTI !S, tienen un tama"o asignado desde el momento en que se crea el programa. Este tipo de variables son sencillas de usar # r$pidas... si sólo vamos a mane%ar estructuras de datos que no cambien, pero resultan poco eficientes si tenemos estructuras cu#o tama"o no sea siempre el mismo. Es el caso de una agenda& tenemos una serie de fichas, e iremos a"adiendo m$s. Si reservamos espacio para '(, no podremos llegar a a"adir la n)mero '', estamos limitando el m$*imo. +na solución sería la de traba%ar siempre en el disco& no tenemos límite en cuanto a n)mero de fichas, pero es muchísimo m$s lento. o ideal sería aprovechar me%or la memoria que tenemos en el ordenador, para guardar en ella todas las fichas o al menos todas aquellas que quepan en memoria. +na soluci ón -tí pic a- pe ro mal a/ es sobredimensionar& preparar una age nda contando con '((( fichas, aunque supongamos que no vamos a pasar de 0((. Esto tiene varios inconvenientes& se desperdicia memoria, obliga a conocer bien los datos con los que vamos a traba%ar, sigue pudiendo verse sobrepasado, etc. OBJETIVOS Entender el concepto de las Estructuras 1in$micas en 2  omprender las venta%as e inconvenientes de las Estructuras 1in$micas en 2 IST!S +na lista es un con%unto de nodos, cada uno de los cuales tiene dos campos& uno de información # un apuntador al siguiente nodo de la lista. !dem$s un apuntador e*terno se"ala el primer nodo de la lista. a información puede ser cualquier tipo de dato simple, estructura de dat os o inclusive uno o m$s ob %etos. a dirección al siguiente nodo es un puntero.

description

que son las estructuras dinámicas y sus tipos

Transcript of ESTRUCTURAS DINAMICAS

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 1/17

INTRODUCCION

Hasta ahora teníamos una serie de variables que declaramos al principio delprograma o de cada función. Estas variables, que reciben el nombre de

ESTÁTI!S, tienen un tama"o asignado desde el momento en que se crea elprograma.

Este tipo de variables son sencillas de usar # r$pidas... si sólo vamos a mane%ar estructuras de datos que no cambien, pero resultan poco eficientes si tenemosestructuras cu#o tama"o no sea siempre el mismo.

Es el caso de una agenda& tenemos una serie de fichas, e iremos a"adiendo m$s.Si reservamos espacio para '(, no podremos llegar a a"adir la n)mero '',estamos limitando el m$*imo. +na solución sería la de traba%ar siempre en el

disco& no tenemos límite en cuanto a n)mero de fichas, pero es muchísimo m$slento.

o ideal sería aprovechar me%or la memoria que tenemos en el ordenador, paraguardar en ella todas las fichas o al menos todas aquellas que quepan enmemoria.

+na solución -típica- pero mala/ es sobredimensionar& preparar una agendacontando con '((( fichas, aunque supongamos que no vamos a pasar de 0((.Esto tiene varios inconvenientes& se desperdicia memoria, obliga a conocer bien

los datos con los que vamos a traba%ar, sigue pudiendo verse sobrepasado, etc.

OBJETIVOS

Entender el concepto de las Estructuras 1in$micas en 2

  omprender las venta%as e inconvenientes de las Estructuras 1in$micas en

2

IST!S

+na lista es un con%unto de nodos, cada uno de los cuales tiene dos campos& unode información # un apuntador al siguiente nodo de la lista. !dem$s un apuntador e*terno se"ala el primer nodo de la lista. a información puede ser cualquier tipode dato simple, estructura de datos o inclusive uno o m$s ob%etos.a dirección al siguiente nodo es un puntero.

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 2/17

3epresentación gr$fica de una lista&

omo decíamos, una lista es una secuencia de nodos en este caso cuatronodos/. a información de los nodos en este caso es un entero # siempre contieneun puntero que guarda la dirección del siguiente nodo.raí4 es otro puntero e*terno a la lista que contiene la dirección del primer nodo.El estado de una lista varía durante la e%ecución del programa&

1e esta forma representamos gr$ficamente una lista vacía.Si insertamos un nodo en la lista quedaría luego&

Si insertamos otro nodo al principio con el valor 5 tenemos&

o mismo podemos borrar nodos de cualquier parte de la lista.Esto nos trae a la mente el primer problema planteado& el desarrollo delprocesador de te*to. 6odríamos utili4ar una lista que inicialmente estuviera vacía eintrodu%7ramos un nuevo nodo con cada línea que tipea el operador. on estaestructura haremos un uso mu# eficiente de la memoria.

ontinuando con el tema de listas traba%aremos con las listas gen7ricas. +na listase comporta como gen7rica cuando las inserciones # e*tracciones se reali4an encualquier parte de la lista.odificaremos una serie de m7todos para administrar listas gen7ricas.

Métodos a desarrollar:

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 3/17

Inserta un nodo en la posición pos/ # con la información que ha# en el par$metro*.  void Insertarint pos, int */E*trae la información del nodo de la posición indicada pos/. Se debe eliminar elnodo.

  int E*traerint pos/8orra el nodo de la posición pos/.  void 8orrarint pos/Intercambia las informaciones de los nodos de las posiciones pos' # pos0. 

void Intercambiarint pos',int pos0/3etorna el valor del nodo con ma#or información.  int 9a#or/3etorna la posición del nodo con ma#or información.  int 6os9a#or/3etorna la cantidad de nodos de la lista.  int antidad/1ebe retornar true si la lista est$ ordenada de menor a ma#or, false en casocontrario.  bool :rdenada/1ebe retornar true si e*iste la información que llega en el par$metro, false en casocontrario.  bool E*isteint info/El m7todo vacía debe retornar true si est$ vacía # false si no lo est$.  bool ;acia/

E%emplo de Insertar un Elemento

6ara insertar en una determinada posición dentro de la lista&

  void Insertar (int pos, int !

6rimero con un if verificamos que e*ista esa posición en la lista por e%emplo si lalista tiene < nodos podemos insertar hasta la posición =, es decir uno m$s all$ del)ltimo/&

  if pos >? antidad / @ '/ A

Si ingresa al if #a podemos crear el nodo&

  Bodo nuevo ? neC Bodo /D  nuevo.info ? *D

 !hora debemos anali4ar si la inserción es al principio de la lista, al final o en medio#a que los enlaces varían seg)n donde se lo inserta.

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 4/17

6ara saber si se inserta al principio de la lista preguntamos si en pos llega un '&

  if pos ?? '/

Si llega un ' luego enla4amos el puntero sig del nodo que creamos con la

dirección del primer nodo de la lista rai4 apunta siempre al primer nodo de la lista/# luego despla4amos rai4 al nodo que acabamos de crear&

  nuevo.sig ? rai4D  rai4 ? nuevoD

Si no se inserta al principio de la lista preguntamos si se inserta al final&

  if pos ?? antidad / @ '/

En caso de insertarse al final recorremos la lista hasta el )ltimo nodo&

  Bodo reco ? rai4D  Chile reco.sig ? null/

A  reco ? reco.sigD  F

# enla4amos el puntero sig del )ltimo nodo de la lista con la dirección del nodo queacabamos de crear disponemos en sig del nodo creado el valor null #a que noha# otro nodo m$s adelante/

  reco.sig ? nuevoD  nuevo.sig ? nullD

Si no se inserta al principio o al final significa que tenemos que insertar en mediode la lista.1isponemos un for donde avan4amos un puntero au*iliar # nos detenemos unaposición antes a donde tenemos que insertarlo&

  for int f ? ' D f >? pos G 0 D f@@/  reco ? reco.sigD

1isponemos otro puntero au*iliar que apunte al nodo pró*imo a donde est$apuntando reco. !hora enla4amos el puntero sig del nodo apuntado por reco conla dirección del nodo creado # el puntero sig del nodo creado con la dirección delnodo siguiente&

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 5/17

  Bodo siguiente ? reco.sigD  reco.sig ? nuevoD  nuevo.sig ? siguienteD

IST!S EBE3I!S :31EB!1!S+na lista gen7rica es ordenada si cuando insertamos información en la lista quedaordenada respecto al campo info sea de menor a ma#or o a la inversa/E%emplo&lista:rdenada.Insertar'(/

lista:rdenada.Insertar=/

lista:rdenada.Insertar/

lista:rdenada.Insertar=(/

6odemos observar que si recorremos la lista podemos acceder a la información demenor a ma#or.Bo se requiere un m7todo para ordenar la lista, sino que siempre permaneceordenada, #a que se inserta ordenada.

IST!S 1:8E9EBTE EB!J!1!S

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 6/17

 ! las listas vistas hasta el momento podemos recorrerlas solamente en unadirección istas simplemente encadenadas/. Ha# problemas donde se requiererecorrer la lista en ambas direcciones, en estos casos el empleo de listasdoblemente encadenadas es recomendable.omo e%emplo pensemos que debemos almacenar un men) de opciones en una

lista, la opción a seleccionar puede ser la siguiente o la anterior, podemosdespla4arnos en ambas direcciones.3epresentación gr$fica de una lista doblemente encadenada&

:bservemos que una lista doblemente encadenada tiene dos punteros por cada

nodo, uno apunta al nodo siguiente # otro al nodo anterior.Seguimos teniendo un puntero rai4/ que tiene la dirección del primer nodo.El puntero sig del )ltimo nodo igual que las listas simplemente encadenadasapunta a null, # el puntero ant del primer nodo apunta a null.Se pueden plantear istas tipo pila, cola # gen7ricas con enlace doble.Ha# que tener en cuenta que el requerimiento de memoria es ma#or en las listasdoblemente encadenadas #a que tenemos dos punteros por nodo.a estructura del nodo es&  class Bodo A  public int infoD  public Bodo sig, antD

  F3esolveremos algunos m7todos para administrar listas gen7ricas empleando listasdoblemente encadenadas para anali4ar la mec$nica de enlace de nodos.9uchos de los m7todos, para listas simple # doblemente encadenadas no varía,como por e%emplo& el constructor, ;acia, antidad, etc.IST!S I3+!3ES

+na lista circular simplemente encadenada la podemos representar gr$ficamente&

:bservemos que el puntero sig del )ltimo nodo apunta al primer nodo. En este tipode listas si avan4amos rai4 no perdemos la referencia al nodo anterior #a que esun círculo.

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 7/17

+na lista circular puede tambi7n ser doblemente encadenada&

El puntero ant del primer nodo apunta al )ltimo nodo de la lista # el puntero sig del)ltimo nodo de la lista apunta al primero.3esolveremos algunos m7todos para administrar listas gen7ricas circularesdoblemente encadenadas para anali4ar la mec$nica de enlace de nodos.

6I!S

+na lista se comporta como una pila si las inserciones # e*tracciones las hacemospor un mismo lado de la lista. Tambi7n se las llama listas IK: ast In Kirst :ut G)ltimo en entrar primero en salir/I"portante& +na pila al ser una lista puede almacenar en el campo de informacióncualquier tipo de valor int, char, float, vector de caracteres, un ob%eto, etc/6ara estudiar el mecanismo de utili4ación de una pila supondremos que en elcampo de información almacena un entero para una f$cil interpretación #codificación/Inicialmente la 6I! est$ vacía # decimos que el puntero rai4 apunta a null Siapunta a null decimos que no tiene una dirección de memoria/&

Insertamos un valor entero en la pila& insertar'(/

uego de reali4ar la inserción la lista tipo pila queda de esta manera& un nodo conel valor '( # rai4 apunta a dicho nodo. El puntero del nodo apunta a null #a que noha# otro nodo despu7s de este.Insertamos luego el valor <& insertar</

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 8/17

 !hora el primer nodo de la pila es el que almacena el valor cuatro. rai4 apunta adicho nodo. 3ecordemos que rai4 es el puntero e*terno a la lista que almacena ladirección del primer nodo. El nodo que acabamos de insertar en el campo punteroguarda la dirección del nodo que almacena el valor '(.

 !hora qu7 sucede si e*traemos un nodo de la pila. Lu$l se e*traeM omosabemos en una pila se e*trae el )ltimo en entrar.

 !l e*traer de la pila tenemos& e*traer/

a pila ha quedado con un nodo.Ha# que tener cuidado que si se e*trae un nuevo nodo la pila quedar$ vacía # nose podr$ e*traer otros valores avisar que la pila est$ vacía/

:!S

+na lista se comporta como una cola si las inserciones las hacemos al final # las

e*tracciones las hacemos por el frente de la lista. Tambi7n se las llama listas KIK:Kirst In Kirst :ut G primero en entrar primero en salir/

a declaración del nodo es igual a la clase 6ila. uego definimos dos punterose*ternos&  class Bodo

A  public int infoD  public Bodo sigD  F 

private Bodo rai4,fondoDraí4 apunta al principio de la lista # fondo al final de la lista. +tili4ar dos punterostiene como venta%a que cada ve4 que tengamos que insertar un nodo al final de lalista no tengamos que recorrerla. 6or supuesto que es perfectamente v$lidoimplementar una cola con un )nico puntero e*terno a la lista.En el constructor iniciali4amos a los dos punteros en null 3ealmente esto esopcional #a que los atributos de una clase en 2 se iniciali4an autom$ticamentecon null/&

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 9/17

  public ola/A

  rai4?nullD  fondo?nullD  F

El m7todo vacía retorna true si la lista no tiene nodos # false en caso contrario&  public bool ;acia /  A  if rai4 ?? null/  return trueD  else  return falseD  FEn la inserción luego de crear el nodo tenemos dos posibilidades& que la cola est7vacía, en cu#o caso los dos punteros e*ternos a la lista deben apuntar al nodocreado, o que ha#a nodos en la lista.  Bodo nuevoD  nuevo ? neC Bodo /D  nuevo.info ? infoD  nuevo.sig ? nullD  if ;acia //

A  rai4 ? nuevoD  fondo ? nuevoD  F  else  A  fondo.sig ? nuevoD  fondo ? nuevoD  F3ecordemos que definimos un puntero llamado nuevo, luego creamos el nodo conel operador neC # cargamos los dos campos, el de información con lo que llega enel par$metro # el puntero con null #a que se insertar$ al final de la lista, es decir noha# otro despu7s de este.Si la lista est$ vacía&

En caso de no estar vacía&

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 10/17

1ebemos enla4ar el puntero sig del )ltimo nodo con el nodo reci7n creado&  fondo.sig ? nuevoD

N por )ltimo el puntero e*terno fondo debe apuntar al nodo apuntado por nuevo&  fondo ? nuevoD

on esto #a tenemos correctamente enla4ados los nodos en la lista tipo cola.

3ecordar que el puntero nuevo desaparece cuando se sale del m7todo insertar,pero el nodo creado no se pierde porque queda enla4ado en la lista.El funcionamiento del m7todo e*traer es similar al de la pila&  public int E*traer /  A  if ;acia //  A  int informacion ? rai4.infoD  if rai4 ?? fondo/  A  rai4 ? nullD

  fondo ? nullD  F  else  A  rai4 ? rai4.sigD  F  return informacionD  F

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 11/17

  else  return int.9a*;alueD  FSi la lista no est$ vacía guardamos en una variable local la información del primer nodo&

  int informacion ? rai4.infoD6ara saber si ha# un solo nodo verificamos si los dos punteros rai4 # fondoapuntan a la misma dirección de memoria&  if rai4 ?? fondo/

uego hacemos&  rai4 ? nullD  fondo ? nullD

En caso de haber 0 o m$s nodos debemos avan4ar el puntero rai4 al siguientenodo&

  rai4 ? rai4.sigD

Na tenemos la lista correctamente enla4ada rai4 apunta al primer nodo # fondocontin)a apuntando al )ltimo nodo/

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 12/17

3E+3SI;I1!1

6rimero debemos decir que la recursividad no es una estructura de datos, sinoque es una t7cnica de programación que nos permite que un bloque deinstrucciones se e%ecute n veces. 3empla4a en ocasiones a estructuras repetitivas.

Este concepto ser$ de gran utilidad para el capítulo de la estructura de datos tipo$rbol.

a recursividad es un concepto difícil de entender en principio, pero luego deanali4ar diferentes problemas aparecen puntos comunes.

En 2 los m7todos pueden llamarse a sí mismos. Si dentro de un m7todo e*iste lallamada a sí mismo decimos que el m7todo es recursivo.

uando un m7todo se llama a sí mismo, se asigna espacio en la pila para lasnuevas variables locales # par$metros.

 !l volver de una llamada recursiva, se recuperan de la pila las variables locales #los par$metros antiguos # la e%ecución se reanuda en el punto de la llamada alm7todo.

6ara administrar un $rbol binario ordenado debemos tener especial cuidado en la

inserción.Inicialmente el $rbol est$ vacío, es decir raí4 apunta a null&

Insertamos el <((

Insertamos el valor '((. 1ebemos anali4ar si raí4 es distinto a null verificamos si'(( es ma#or o menor a la información del nodo apuntado por raí4, en este casoes menor # como el sub$rbol i4quierdo es null debemos insertarlo allí.

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 13/17

Insertamos el 0((. Ha# que tener en cuenta que siempre comen4amos lascomparaciones a partir de raí4. El 0(( es menor que <((, descendemos por elsub$rbol i4quierdo. uego anali4amos # vemos que el 0(( es ma#or a '((,

debemos avan4ar por derecha. omo el sub$rbol derecho es null lo insertamos endicha posición.

Insertamos el (( # el $rbol ser$&

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 14/17

omo podemos observar si cada ve4 que insertamos un nodo respetamos estealgoritmo siempre estaremos en presencia de un $rbol binario ordenado.6osteriormente veremos el algoritmo en %ava para la inserción de información en el$rbol.

B#s$%eda de in&or"a'in en %n )r*ol *inario ordenado+

Este es una de los principales usos de los $rboles binarios.6ara reali4ar una b)squeda debemos ir comparando la información a buscar #descender por el sub$rbol i4quierdo o derecho seg)n corresponda.E%. Si en el $rbol anterior necesitamos verificar si est$ almacenado el ((, primeroverificamos si la información del nodo apuntado por raí4 es ((, en caso negativoverificamos si la información a buscar ((/ es ma#or a la información de dichonodo <((/ en caso afirmativo descendemos por el sub$rbol derecho en casocontrario descendemos por el sub$rbol i4quierdo.Este proceso lo repetimos hasta encontrar la información buscada o encontrar unsub$rbol vacío.

Re'orridos de )r*oles *inarios+

3ecorrer& 6asar a trav7s del $rbol enumerando cada uno de sus nodos una ve4.;isitar& 3eali4ar alg)n procesamiento del nodo.os $rboles pueden ser recorridos en varios órdenes&6reGorden&  G ;isitar la raí4.  G 3ecorrer el sub$rbol i4quierdo en preGorden.  G 3ecorrer el sub$rbol derecho en preGorden.

EntreGorden  G 3ecorrer el sub$rbol i4quierdo en entreGorden.  G ;isitar la raí4.  G 3ecorrer el sub$rbol derecho en entreGorden.

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 15/17

6ostGorden  G 3ecorrer el sub$rbol i4quierdo en postGorden.  G 3ecorrer el sub$rbol derecho en postGorden.  G ;isitar la raí4.

E%emplo&

;eamos como se imprimen las informaciones de los nodos seg)n su recorrido&Re'orrido preorden:

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 16/17

Es decir que el orden de impresión de la información es&<(( O '(( O=( O = O0(( O ((Es importante anali4ar que el recorrido de $rboles es recursivo. 3ecorrer unsub$rbol es seme%ante a recorrer un $rbol.Es buena pr$ctica dibu%ar el $rbol en un papel # hacer el seguimiento del recorrido

# las visitas a cada nodo.Re'orrido entreorden:

Es decir que el orden de impresión de la información es&=( O= O '(( O0(( O <(( O ((Si observamos podemos ver que la información aparece ordenada.Este tipo de recorrido es mu# )til cuando queremos procesar la información del$rbol en orden.Re'orrido postorden:

7/18/2019 ESTRUCTURAS DINAMICAS

http://slidepdf.com/reader/full/estructuras-dinamicas-56d4673a2aa85 17/17

Es decir que el orden de impresión de la información es&= O =( O 0(( O '(( O (( O <((

CONCUSIONES

 

as estructuras de datos din$micas, nos permiten tener tama"os que se

adecuan seg)n se van almacenando, lo que nos permite tener un granahorro # aprovechamiento de la memoria.

• Todas estas estructuras din$micas tienen en com)n que, si se programancorrectamente, pueden ir creciendo o decreciendo seg)n haga falta, al

contrario que un arra#, que tiene su tama"o prefi%ado.