You are on page 1of 11

11/3/2014

LISTAS ENLAZADAS ESTRUCTURA DATOS C#

13.2K

13
Like

LISTAS ENLAZADAS Una lista enlazada la constituye una coleccin lineal de elementos, llamados nodos, donde el orden de los mismos se establece mediante punteros. Cada nodo se divide en dos partes: una primera que contiene la informacin asociada al elemento, y una segunda parte, llamada campo de enlace o campo al siguiente puntero, que contiene la direccin del siguiente nodo de la lista. Una lista enlazada es una coleccin lineal de elementos donde el orden de los mismos se establece mediante punteros. La idea bsica es que cada componente de la lista incluya un puntero que indique donde puede encontrarse el siguiente componente por lo que el orden relativo de estos puede ser fcilmente alterado modificando los punteros lo que permite, a su vez, aadir o suprimir elementos de la lista. Una lista enlazada es una serie de nodos, conectados entre s a travs de una referencia, en donde se almacena la informacin de los elementos de la lista. Por lo tanto, los nodos de una lista enlazada se componen de dos partes principales: Ventajas de usar listas: Las listas son dinmicas, es decir, podemos almacenar en ellas tantos elementos como necesitemos, siempre y cuando haya espacio suficiente espacio en memoria. Al insertar un elemento en la lista, la operacin tiene un tiempo constante independientemente de la posicin en la que se inserte, solo se debe crear el nodo y modificar los enlaces. Esto no es as en los arreglos, ya que si el elemento lo insertamos al inicio o en medio, tenemos un tiempo lineal debido a que se tienen que mover todos los elementos que se encuentran a la derecha de la posicin donde lo vamos a insertar y despus insertar el elemento en dicha posicin; solo al insertar al final del arreglo se obtienen tiempos constantes. Al eliminar un elemento paso lo mismo que se menciono en el punto anterior. Desventajas de usar listas: El acceso a un elemento es ms lento, debido a que la informacin no est en posiciones contiguas de memoria, por lo que no podemos acceder a un elemento con base en su posicin como se hace en los arreglos. REPRESENTACION DE LISTAS ENLAZADAS EN MEMORIA Sea LISTA una lista enlazada, salvo que se indique lo contrario. Almacenaremos LISTA en memoria de la forma siguiente. Como mnimo, LISTA estar compuesta por dos arrays lineales, a los que llamaremos INFO y ENLACE, tales que INFO [K] y ENLACE [K] contienen la parte de informacin y el campo de puntero de cada nodo de LISTA respectivamente. Necesitamos tambin una variable especial llamada COMIENZO que contiene la posicin ocupada por el primer elemento de la lista, y una marca especial NULO que indica el final de la misma. Puesto que los ndices de los arrays INFO y ENLACE sern habitualmente positivos, el valor NULO ser el -999, salvo que digamos lo contrario. El siguiente ejemplo muestra la representacin memoria de una lista enlazada en la que cada nodo de la lista contiene un nico carcter. Podemos obtener la lista de caracteres o, en otras palabras, la cadena de la forma siguiente: COMIENZO = 9, luego INFO [9] = N primer carcter. ENLACE [9] = 3, luego INFO [3] = 0 segundo carcter. ENLACE [3] = 6, luego INFO [6] = (carcter blanco) tercer carcter. ENLACE [6] = 11, luego INFO [11] = E cuarto carcter. ENLACE [11] = 7, luego INFO [7] = X quinto carcter. ENLACE [7] = 10, luego INFO [10] = I sexto carcter. ENLACE [10] = 4, luego INFO [4] = T sptimo carcter. ENLACE [4] = -999 valor nulo, luego termina la lista. FORMA PRINCIPAL DE LA LISTA ENLAZADA Codigo:

u s i n gS y s t e m ; u s i n gS y s t e m . C o l l e c t i o n s . G e n e r i c ; u s i n gS y s t e m . C o m p o n e n t M o d e l ; u s i n gS y s t e m . D a t a ; u s i n gS y s t e m . D r a w i n g ; u s i n gS y s t e m . T e x t ; u s i n gS y s t e m . W i n d o w s . F o r m s ; n a m e s p a c eW i n d o w s A p p l i c a t i o n 1 { p u b l i cp a r t i a lc l a s sL i s t a s:F o r m {

http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas

1/11

11/3/2014

LISTAS ENLAZADAS ESTRUCTURA DATOS C#


p u b l i cL i s t a s ( ) { I n i t i a l i z e C o m p o n e n t ( ) ; } p u b l i cs t a t i ci n t [ ]e n l a c e=n e wi n t [ 1 0 ]{2 ,3 ,4 ,0 ,9 9 9 ,6 ,7 ,8 ,9 ,9 9 9} ; p u b l i cs t a t i cs t r i n g [ ]a l u m n o=n e ws t r i n g [ 1 0 ]{" J o s e " ," A n a " ," R o s a " ," B e t o " ," z e t a " ," " ," " ," " ," " ," "} ; p u b l i cs t a t i ci n tc o m i e n z o=1 ; p u b l i cs t a t i ci n td i s p o n i b l e=5 ; p r i v a t ev o i dc m d I n s e r c i o n _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { I n s e r c i o ni n s=n e wI n s e r c i o n ( ) ; i n s . S h o w ( ) ; } p r i v a t ev o i dc m d R e c o r r i d o _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { R e c o r r e rr e c=n e wR e c o r r e r ( ) ; r e c . S h o w ( ) ; } p r i v a t ev o i dc m d B u s q u e d a _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { B u s q u e d ab u s=n e wB u s q u e d a ( ) ; b u s . S h o w ( ) ; } p r i v a t ev o i dc m d E l i m i n a c i o n _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { E l i m i n a c i o ne l i=n e wE l i m i n a c i o n ( ) ; e l i . S h o w ( ) ; }

} }

Corrida

RECORRIDO DE UNA LISTA ENLAZADA Sea la lista enlazada, almacenada en memoria mediante dos arrays INFO y ENLACE. Adicionalmente definimos la variable COMIENZO que apunta al primer elemento de la lista y suponemos que el ltimo nodo de la lista contiene en su campo ENLACE el valor NULO. Supongamos que queremos recorrer LISTA para procesar cada uno de sus nodos exactamente una vez. A continuacin te mostrare el algoritmo que realiza esta tarea y que utilizaremos en otras aplicaciones. Nuestro algoritmo utiliza una variable puntero PTR que apunta siempre al nodo procesado en cada momento. Por ello ENLACE [PTR] indica el siguiente nodo a ser procesado. De esta forma la asignacin PTR:= ENLACE [PTR] Tiene el efecto de mover el puntero al siguiente nodo de la lista. La descripcin del algoritmo es la siguiente. Inicializamos PTR a COMIENZO. A continuacin procesamos INFO [PTR], es decir, la informacin del primer nodo. En el paso siguiente actualizamos PTR mediante la asignacin PRT: = ENLACE [PTR], lo que hace que PTR apunte ahora al segundo nodo. Nuevamente tratamos de la informacin contenida en INFO [PTR] (segundo nodo) y tras esto volvemos a actulizar PTR y procesamos INFO [PTR], y asi sucesivamente. Este proceso de actualizacion y procesamiento continuara hasta que en una de las actualizaciones de PTR obtengamos que PTR = NULO, que marca el final de la lista. Una representacin formal de algoritmo es la siguiente. Algoritmo: Recorrido de una lista enlazada.

http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas

2/11

11/3/2014

LISTAS ENLAZADAS ESTRUCTURA DATOS C#

Sea LISTA una lista enlazada que almacenamos en memoria. El algoritmo recorre LISTA realizando la operacin PROCESO a cada elemento de LISTA. La variable PTR, apunta en cada momento al nodo que se esta tratando. 1. PTR: = COMIENZO. [inicializa el puntero]. 2. repetir pasos 3 y 4 mientras PTR != 0. 3. aplicar PROCESO a INFO [PTR]. 4. PTR: = ENLACE [PTR]. [PTR apunta ahora al siguiente nodo]. [fin del ciclo paso 2]. 5. salir. Codigo:

u s i n gS y s t e m ; u s i n gS y s t e m . C o l l e c t i o n s . G e n e r i c ; u s i n gS y s t e m . C o m p o n e n t M o d e l ; u s i n gS y s t e m . D a t a ; u s i n gS y s t e m . D r a w i n g ; u s i n gS y s t e m . T e x t ; u s i n gS y s t e m . W i n d o w s . F o r m s ; n a m e s p a c eW i n d o w s A p p l i c a t i o n 1 { p u b l i cp a r t i a lc l a s sR e c o r r e r:F o r m { p u b l i cR e c o r r e r ( ) { I n i t i a l i z e C o m p o n e n t ( ) ; R e c o r r i d o ( ) ; } p r i v a t ev o i dc m d R e c o r r e r _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { l i s t B o x 1 . I t e m s . C l e a r ( ) ; R e c o r r i d o ( ) ; } p r i v a t ev o i dR e c o r r i d o ( ) { i n tp t r=L i s t a s . c o m i e n z o ; w h i l e( p t r! =9 9 9 ) { l i s t B o x 1 . I t e m s . A d d ( L i s t a s . a l u m n o [ p t r ] ) ; p t r=L i s t a s . e n l a c e [ p t r ] ; } } p r i v a t ev o i db u t t o n 1 _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { t h i s . C l o s e ( ) ; } } }

Corrida

BUSQUEDA EN UNA LISTA ENLAZADA Sea LISTA una lista enlazada, almacenada en memoria. En esta seccion discutimos dos algoritmos de bsqueda que localizan la posicin del nodo (LUG) en el cual un elemento dado (ELEMENTO) aparece por primera vez en la lista. El primer algoritmo no necesita que la lista este ordenada, mientras que el segundo si lo exige. Si ELEMENTO es una valor de clave y buscamos en el archivo para encontrar el registro que lo contiene, este solo puede aparecer una vez en la lista. Lista no ordenadas
http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas 3/11

11/3/2014

LISTAS ENLAZADAS ESTRUCTURA DATOS C#

Supongamos que los datos de lista no estan ordenados (necesariamente). En este caso podremos localizar ELEMENTO sin mas que recorrer LISTA utilizando el puntero PTR y comparando ELEMENTO con el contenido INFO [PTR] de cada nodo. Cada vez que actualicemos PTR mediante la asignacin PTR: = ENLACE [PTR], necesitamos dos comprobaciones. Primero necesitamos ver si hemos alcanzado el final de la lista, es decir comprobamos si PTR = NULO, si no, entonces comprobamos si INFO [PTR] = ELEMENTO. Las dos comprobaciones no podemos realizarlas simultneamente, puesto que si PTR = NULO no existira INFO [PTR]. De acuerdo con esto utilizamos la primera comparacin para controlar la ejecucin de un ciclo y realizamos la segunda comparacin dentro de este. Algoritmo: BUSQ(INFO, ENLACE, COMIENZO, ELEMENTO, LUG) LISTA es una lista enlazada almacenada en memoria. el algoritmo encuentra la posicion LUG del nodo donde ELEMENTO aparece por primera vez en lista y devuelve LUG = NULO. 1. PTR: = COMIENZO. 2. repetir paso 3 mientras PTR != NULO: 3. si ELEMENTO = INFO[PTR], entonces: LUG: = PTR y salir. 4. si no: PTR: = ENLACE [PTR]. [PTR apunta ahora al nodo siguiente]. 5. [final de la estructura condicional]. 6. [final del ciclo del paso 2]. 7. [la busqueda es fallida]. LUG: = NULO. 8. salir Lista ordenada Supongamos que los datos de LISTA estan ordenados. de nuevo buscamos ELEMENTO en la lista recorriendo la misma utilizando una variable puntero y comparando ELEMENTO con el contenido de INFO[PTR] nodo a nodo. en este caso, sin embargo, podremos finalizar la busqueda una vez que ELEMENTO sea mayor que INFO[PTR]. Algoritmo: BUSQ(INFO, ENLACE, COMIENZO, ELEMENTO, LUG) LISTA es una lista ordenada que se encuentra en memoria. el algoritmo encuentra la posicion LUG del nodo donde se encuentra por pirmera vez ELEMENTO o bien devuelve LUG = NULO. 1. PTR:= COMIENZO. 2. repetir paso 3 mientras PTR != NULO: 3. si ELEMENTO < INFO[PTR], entonces: 4. PTR: = ENLACE [PTR]. [PTR apunta al siguiente nodo]. 5. si no, si ELEMENTO = INFO[PTR], entonces: 6. LUG = PTR y salir. [la busqueda es satisfactoria]. 7. si no: LUG: = NULO y salir. [ELEMENTO es mayor que INFO[PTR]]. 8. [final de la estructura condicional] 9. [final del ciclo del paso 2] 10. LUG: = NULO. 11. salir. Codigo:

u s i n gS y s t e m ; u s i n gS y s t e m . C o l l e c t i o n s . G e n e r i c ; u s i n gS y s t e m . C o m p o n e n t M o d e l ; u s i n gS y s t e m . D a t a ; u s i n gS y s t e m . D r a w i n g ; u s i n gS y s t e m . T e x t ; u s i n gS y s t e m . W i n d o w s . F o r m s ; n a m e s p a c eW i n d o w s A p p l i c a t i o n 1 { p u b l i cp a r t i a lc l a s sB u s q u e d a:F o r m { p u b l i cB u s q u e d a ( ) { I n i t i a l i z e C o m p o n e n t ( ) ; } p r i v a t ev o i dc m d B u s c a r _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { s t r i n ge l e m e n t o=t x t b u s c a d o r . T e x t . T o S t r i n g ( ) ; i n tl u g=9 9 9 ; i n tp t r=L i s t a s . c o m i e n z o ;

http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas

4/11

11/3/2014

LISTAS ENLAZADAS ESTRUCTURA DATOS C#


i f( p t r= =9 9 9 )M e s s a g e B o x . S h o w ( " L i s t av a c i a " ," E r r o r " ) ; w h i l e( p t r! =9 9 9 ) { i f( L i s t a s . a l u m n o [ p t r ]= =e l e m e n t o ) { l u g=p t r ; M e s s a g e B o x . S h o w ( " E l e m e n t oe n c o n t r a d oe n\ n p o s i c i o n :"+l u g . T o S t r i n g ( ) ," E l e m e n t oE n c o n t r a d o " ) ; t x t b u s c a d o r . C l e a r ( ) ; } e l s ep t r=L i s t a s . e n l a c e [ p t r ] ; } i f( l u g= =9 9 9 )M e s s a g e B o x . S h o w ( " E l e m e n t on oe n c o n t r a d o " ," E r r o r " ) ; } p r i v a t ev o i db u t t o n 1 _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { t h i s . H i d e ( ) ; }

} }

Corrida

INSERCION EN UNA LISTA ENLAZADA Sea LISTA una lista enlazada en la que los nodos A y B ocupan posiciones sucesivas en el orden impuesto en la lista. Supongamos que queremos insertar en ella un nodo N que debe ocupar un lugar entre A y B. Despus de la operacin el nodo A apuntara al nodo N y este apuntara al nodo B, es decir, el nodo al que apuntaba antes A. Algoritmo de insercion tres son las situaciones mas comunes que nos encontraremos cuando insertamos nodos en una lista. Primero cuando queremos insertar un nodo al principio de la lista, segundo cuando queramos insertar un nodo detras de un detreminado, y tercero, cuando insertamos un nodo en una lista previamente ordenada. A continuacion discutimos los algoritmos que llevan a cabo estas tareas suponiendo que la lista esta almacenada en memoria en la forma LISTA(INFO, ENLACE, COMIENZO, DISP) y que la variable ELEMENTO contiene la informacion que debe incorporarse a la lista. Puesto que nuestros algoritmos de insercion utilizaran nodos de la lista de nodos disponibles, todos ellos deben incluir los siguientes pasos: Estudiar si existe espacio libre en la lista de espacio disponible. Si no es asi, es decir, si DISPONIBLE = NULO, el algoritmo debe imprimir el mensaje OVERFLOW. Extraer el primer nodo de la lista de disponible. Si utilizamos la variable Nuevo, esta operacion puede realizarse mediante dos asignaciones (en este orden) NUEVO: = DISP. DISP: = ENLACE[DISP]. Incorporar la informacion a insertar en el nodo recien obtenido, es decir: INFO[NUEVO] = ELEMENTO. Insercion al principio de una lista Supongamos que nuestra lista no esta ordenada ni existe ninguna razon por la cual cualquier nodo que insertemos deba ocupar una determinada posicion. En este caso lo mas sencillo sera insertar el nuevo nodo al comienzo de la misma. Un algoritmo que realiza esta operacion es el siguiente. Algoritmo: INSPRIN(INFO, ENLACE, COMIENZO, DISP, ELEMENTO) El algoritmo coloca ELEMENTO como primer componente de la lista. 1. [Overflow] si DISP = NULO, entonces: Escribir: OVERFLOW y salir. 2. [extrae el primer nodo de la lista DISP]. 3. NUEVO: = DISP y DISP: = ENLACE[DISP]. 4. INFO[NUEVO]: = ELEMENTO. [copia el dato en el nodo]. 5. ENLACE[NUEVO]: = COMIENZO. [el nuevo nodo apunta ahora al que ocupa antes la primera posicion]. 6. COMIENZO: = NUEVO. [COMIENZO apunta ahora al elemento que ocupa la primera posicion de la lista]. 7. Salir.

http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas

5/11

11/3/2014

LISTAS ENLAZADAS ESTRUCTURA DATOS C#

Insercion a continuacion de un nodo determinado Supongamos en este caso que se nos da un valor LUG que o bien representa la localizacion de un nodo A determinado o bien LUG = NULO. El algoritmo siguiente inserta ELEMENTO en la lista a continuacion de A o bien coloca ELEMENTO como primer componente de la lista si LUG = NULO. Sea N el nuevo nodo (cuya posicion es NUEVO). Si LUG = NULO, entonces el nodo se coloca al comienzo de la lista. En otro caso hacemos que N apunte al nodo B (que originalmente seguia a A). El proceso implica las siguientes operaciones: ENLACE[NUEVO]: = ENLACE[LUG] despues del cual N apunta a B y ENLACE[LUG]: = NUEVO tras el cual A apunta al nodo N. Algoritmo: INSLUG(INFO, ENLACE, COMIENZO, DISP, LUG, ELEMENTO) el algoritmo inserta ELEMENTO a continuacion del nodo que ocupa la posicion LUG o coloca ELEMENTO como primer nodo si LUG=NULO 1. [Overflow] Si DISP = NULO, entonces: escribir: OVERFLOW y salir. 2. [Extrae el primer nodo de la lista de disponibles] 3. NUEVO: = DISP y DISP: = ENLACE[DISP]. 4. INFO[NUEVO]: = ELEMENTO. [copia el dato en el nodo obtenido]. 5. Si LUG = NULO, entonces [Lo inserta como primer nodo]. 6. ENLACE[NUEVO]: = COMIENZO y COMIENZO: = NUEVO. 7. Si no: [Inserta detras del nodo de posicion LUG]. 8. ENLACE[NUEVO]: = ENLACE[LUG] y ENLACE[LUG]: = NUEVO. 9. [Final de la estructura condicional] 10. Salir. Insercion de una lista enlazada y ordenada Supongamos que queremos insertar ELEMENTO en una lista enlazada y ordenada y que ELEMENTO cumple que INFO(a) <ELEMENTOINFO(b). Por tanto ELEMENTO debe insertarse en un nuevo nodo entre A y B. El procedimiento siguiente calcula la posicion LUG que ocupa el nodo A, es decir, la posicion del nodo que precedera a ELEMENTO en la lista. Para ello utiliza dos punteros PTR y AUX. Con PTR recorre la lista y va comparando ELEMENTO con INFO[PTR] para todos los nodos que visita. Despues de cada comparacion actualiza el valor de ambos punteros, de tl forma que AUX:= PTR y posteiormente PTR:= ENLACE[PTR]. Con este mecanismo garantizamos que AUX siempre apunta al nodo que precede al que esta siendo apuntado por PTR. El recorrido de la lista continua hast que INFO[PTR] > ELEMENTO, o en otras palabras, la busqueda finaliza cuando ELEMENTO INFO[PTR]. Una representacion formal del procedimiento es el siguiente. En dicho procedimiento se comtemplan por separado los casos en que la lista esta vacia o bien cuando ELEMENTO < INFO[COMIENZO] debido a que no precisan el uso de la variable AUX. Procedimiento: ENCA (INFO, ENLACE, COMIENZO, ELEMENTO, LUG) El procedimiento encuentra la posicion LUG del ultimo nodo para el que INFO[LUG] < ELEMENTO o hace LUG = NULO. 1. [Lista vacia?] Si COMIENZO = NULO, entonces: LUG = NULO y retornar. 2. [caso especial?] Si ELEMENTO < INFO[COMIENZO]. entonces: LUG: = NULO y retornar. 3. AUX: = COMIENZO y PTR: = ENLACE[COMIENZO]. [Inicializamos los punteros]. 4. Repetir pasos 5 y 6 mientras PTR != NULO. 5. Si ELEMENTO < INFO[PTR]. entonces: 6. LUG: = AUX y retornar. 7. [Final de la estructura condicionla]. 8. AUX: = PTR y PTR: = ENLACE[PTR]. [Actualiza los punteros]. 9. LUG: = AUX. 10. Salir. Despues de esto ya tenemos las herramientas necesarias para disear un algoritmo que nos inserte ELEMENTO en una lista enlazada. Algoritmo: INSERT(INFO, ENLACE, COMIENZO, DISP, ELEMENTO) El algoritmo inserta ELEMENTO en una lista enlazada ordenada.
http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas 6/11

11/3/2014

LISTAS ENLAZADAS ESTRUCTURA DATOS C#

1. [Utilizamos el procedimiento 6 para encontrar la posicion del nodo que precedera a ELEMENTO.] 2. Llamar ENCA (INFO, ENLACE, COMIENZO, ELEMENTO, LUG) 3. [Utilizaremos el algoritmo 5 para insertar ELEMENTO a continuacion del nodo que ocupa la posicion LUG.] 4. Llamar INSLUG(INFO, ENLACE, COMIENZO, DISP, LUG, ELEMENTO) 5. Salir. Codigo:

u s i n gS y s t e m ; u s i n gS y s t e m . C o l l e c t i o n s . G e n e r i c ; u s i n gS y s t e m . C o m p o n e n t M o d e l ; u s i n gS y s t e m . D a t a ; u s i n gS y s t e m . D r a w i n g ; u s i n gS y s t e m . T e x t ; u s i n gS y s t e m . W i n d o w s . F o r m s ; n a m e s p a c eW i n d o w s A p p l i c a t i o n 1 { p u b l i cp a r t i a lc l a s sI n s e r c i o n:F o r m { p u b l i cI n s e r c i o n ( ) { I n i t i a l i z e C o m p o n e n t ( ) ; }

p r i v a t ev o i dc d m I n s e r t a _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { s t r i n ge l e m e n t o=t x t I n s e r . T e x t ; t x t I n s e r . C l e a r ( ) ; i f( L i s t a s . d i s p o n i b l e= =9 9 9 ) { M e s s a g e B o x . S h o w ( " L i s t al l e n a " ," E r r o r " ,M e s s a g e B o x B u t t o n s . O K ) ; } e l s e { i n ta n t e r i o r=9 9 9 ; i n tp t r=L i s t a s . c o m i e n z o ; i n ti=0 , n u e v o ; n u e v o=L i s t a s . d i s p o n i b l e ; b o o la u x=f a l s e ; L i s t a s . d i s p o n i b l e=L i s t a s . e n l a c e [ n u e v o ] ; L i s t a s . a l u m n o [ n u e v o ]=e l e m e n t o ; w h i l e( p t r! =9 9 9& &a u x= =f a l s e ) { i f( L i s t a s . a l u m n o [ p t r ] . L e n g t h<e l e m e n t o . L e n g t h ){i=L i s t a s . a l u m n o [ L i s t a s . c o m i e n z o ] . L e n g t h ;} e l s e{i=e l e m e n t o . L e n g t h ;} i n th=0 ; f o r( h = 0 ;h<i ;h + + ) { i f( L i s t a s . a l u m n o [ p t r ] [ h ]= =e l e m e n t o [ h ] ){ } i f( L i s t a s . a l u m n o [ p t r ] [ h ]<e l e m e n t o [ h ] ) { a n t e r i o r=p t r ; h=i ; } e l s e { h=i ; a u x=t r u e ; } } p t r=L i s t a s . e n l a c e [ p t r ] ; } i f( a n t e r i o r= =9 9 9 ) { L i s t a s . e n l a c e [ n u e v o ]=L i s t a s . c o m i e n z o ; L i s t a s . c o m i e n z o=n u e v o ; } e l s e { L i s t a s . e n l a c e [ n u e v o ]=L i s t a s . e n l a c e [ a n t e r i o r ] ; L i s t a s . e n l a c e [ a n t e r i o r ]=n u e v o ; } b u t t o n 1 . T e x t=" C e r r a r " ; } } p r i v a t ev o i db u t t o n 1 _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { t h i s . H i d e ( ) ; }

http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas

7/11

11/3/2014
} }

LISTAS ENLAZADAS ESTRUCTURA DATOS C#

Corrida

ELIMINACION DE UN ELEMENTO DE UNA LISTA ENLAZADA Sea lista una lista enlazada en la cual el nodo N se encuentra entre los nodos A y B. Supongamos que queremos eliminar el nodo N de la lista. La eliminacin se produce tan pronto como el puntero de enlace siguiente del nodo A apunte al nodo B. (por ello cuando realizamos eliminaciones debemos almacenar de alguna forma la direccion del nodo que precede al que vamos a borrar.) Supongamos que la lista enlazada se mantiene en memoria en la forma siguiente: LISTA(INFO, ENLACE, COMIENZO, DISP) Cuando eliminamos el nodo N de la lista debemos devolverlo inmediatamente a la lista de espacio disponible. Por facilidad en el proceso esta devolucion se realiza insertando el nodo devuelto al principio de la lista DISP. Observese que esta operacin implica cambiar tres punteros de la forma siguiente: el puntero siguiente del nodo A debe cambiarse para apuntar al nodo B, al que apuntaba previamente N. el puntero del nodo N se cambia y se le hace apuntar al primer nodo de la lista de nodos disponibles. El puntero DISP se cambia y pasa de apuntar al antiguo primer nodo de la lista de disponibles para apuntar a N que sera el nuevo primer nodo. Existen dos casos especiales que implican actuaciones distintas. Si el nodo N que eliminamos es el primero de la lista, el puntero COMIENZO debera cambiarse para apuntar al nodo B. En cambio, si N es el ultimo de la lista, entonces el puntero A debera ponerse a NULO. Algoritmos de eliminacin Los algoritmos que eliminan nodos de una lista son utilizados en distintas situaciones. En este epgrafe discutiremos dos de ellas. La primera situacin es la que implica borrar el nodo siguiente a uno dado. La segunda situacin implica borrar un nodo que contiene un determinado elemento. En todos los algoritmos suponemos que la lista enlazada se almacena en memoria de la forma LISTA (INFO, ENLACE, COMIENZO, DISP). Tambien en todos ellos devolvemos el nodo eliminado a la lista de nodos disponibles, insertandolos al principio de esta. Por ello nuestros algoritmos incluiran las siguientes asignaciones, donde LUG es la posicin del nodo N borrado: ENLACE[LUG]: = DISP y DISP: = LUG. Algunos de nuestros algoritmos pueden borrar o bien el primer elemento de la lista o bien el ultimo. Cualquier algoritmo que haga esto debe analizar primero si existe algun elemento en la lista. Si no existe ningun, si COMIENZO = NULO, el algoritmo imprimira el mensaje UNDERFLOW. Eliminacion del nodo sucesor de uno determinado Sea LISTA una lista enlazada almacenada en memoria. Supongamos que queremos eliminar de LISTA el nodo N que ocupa el lugar LUG y que conocemos el lugar LUGP del nodo que precede a N en la lista o bien si el nodo N es el primer LUG = NULO. El algoritmo siguiente elimina N de la lista. Algoritmo: BOR (INFO, ENLACE, COMIENZO, DISP, LUG, LUGP) El algoritmo elimina de la lista el nodo N que ocupa la posicin LUG, siendo LUGP la posicin del nodo que precede a N o bien LUGP = 0 si N es el primero de la lista. 1. si LUGP = NULO. Entonces: 2. COMIENZO: = ENLACE[COMIENZO]. [Elimina el primer nodo]. 3. Si no: 4. ENLACE[LUGP]: = ENLACE[LUG]. [Elimina el nodo N].
http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas 8/11

11/3/2014

LISTAS ENLAZADAS ESTRUCTURA DATOS C#

5. [Final de la estructura condicional]. 6. [Devolvemos el nodo a la lista DISP]. 7. ENLACE[LUG]: = DISP Y DISP: = LUG. 8. Salir. Eliminacion de un nodo que contiene un determinado elemento de informacion Sea LISTA una lista enlazada almacenada en memoria. Supongamos que queremos eliminar de la lista el primer nodo N que contenga la informacion ELEMENTO. (Si ELEMENTO es un valor de clave, solo puede contenerlo un unico nodo.) Recuerdese que antes de borrar el nodo N que contiene a ELEMENTO debemos conocer que nodo precede a N en la lista. Por ello veremos previamente un procedimiento que localiza la posicion LUG del nodo N que contiene a ELEMENTO y la posicion LUGP del nodo que precede a N. En el caso de que N sea el primer nodo de la lista, el procedimiento devuelve LUGP = NULO y en caso de que ELEMENTO no se encuentre en la lista devolvera LUG = NULO. (Como puede verse el procedimiento es similar al procedimiento) Procedimiento: ENCB(INFO, ENLACE, COMIENZO, ELEMENTO, LUG, LUGP) El procedimiento encuentra la posicion LUG del primer nodo N que contiene a ELEMENTO y la posicion LUGP del nodo anterior a N. Si ELEMENTO no se encuentra en la lista, el procedimiento devuelve LUG = NULO y si ELEMENTO se encuentra en el primer nodo, entonces hace LUGP = NULO. 1. [Lista vacia?] Si COMIENZO: = NULO, entonces: 2. LUG: = NULO Y LUGP: = NULO y Retornar. 3. [Final de la estructura condcional]. 4. [Se encuentra ELEMENTO en el priemr nodo?] 5. Si INFO[COMIENZO] = ELEMENTO, entonces 6. LUG: = COMIENZO y LUGP = NULO y Retornar. 7. [Final de la estructura condicional]. 8. AUX: = COMIENZO y PTR: = ENLACE[COMIENZO]. [Inicializamos los punteros]. 9. Repetir mientras PTR != NULO. 10. Si INFO[PTR] = ELEMENTO, entonces: 11. LUG: = PTR y LUGP: = AUX y Retornar. 12. [Final de la estructura condicional]. 13. AUX: = PTR y PTR: = ENLACE[PTR]. [Actualizamos los punteros]: 14. [Final del ciclo]. 15. LUG: = NULO [Busqueda fallida]. 16. Retornar. El procedimiento recorre la lista utilizando dos punteros PTR y AUX. Con PTR recorremos la lista y comparamos sucesivamente ELEMENTO con INFO[PTR]. En cada momento AUX apunta al nodo anterior al apuntado por PTR. Por ello despues de cada fallida actualizamos ambas de la siguiente forma: AUX: = PTR y PTR: = ENLACE[PTR] El recorrido de la lista continua mientras que INFO[PTR] != ELEMENTO o, en otras palabras, la busqueda termianra cuando INFO[PTR]=ELEMENTO. En este momento PTR = LUG o direccion del nodo N buscado y AUX apuntara al nodo anterior. La formalizacion de este procedimieno se establece a continuacion. En ella se puede observar que se tratan por separado los casos en que la lista esta vacia y el caso en que N es el primer nodo. Esto se hace asi debido a que ambos casos no precisan la utilizacion de la variable AUX. Despues de desarrollar este procedimiento estamos en condiciones de disear un algoritmo muy sencillo que elimina de una lista enlazada aquel nodo N en el que aparece por primera vez la informacion ELEMENTO. La simplicidad de este algoritmo estriba en que la localizacion de N y de su prodecesor pueda realizarse utilizando el procedimiento anterior. Algoritmo: ELIMINAR(INFO, ENLACE, COMIENZO, DISP, ELEMENTO) El algoritmo elimina de la lista enlazada el primer nodo N que contiene la informacion ELEMENTO. 1. [Utilizamos el procedimiento anterior para encontrar la posicion de N y su predecesor en la lista.] 2. Llamar ENCB(INFO, ENLACE, COMIENZO, ELEMENTO, LUG, LUGP). 3. Si LUG: = NULO, entonces: Escribir: ELEMENTO no se encuentra en la lista y salir. 4. [Eliminamos el nodo]. 5. Si LUGP = NULO, entonces: 6. COMIENZO: = ENLACE[COMIENZO]. [Eliminamos el primer nodo]. 7. Si no: 8. ENLACE[LUGP]: = ENLACE[LUG].
http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas 9/11

11/3/2014

LISTAS ENLAZADAS ESTRUCTURA DATOS C#

9. [Final de la estructura condicional]. 10. [Devolvemos el nodo eliminado a la lista de nodos disponibles]. 11. ENLACE[LUG]: = DISP y DISP: = LUG. 12. Salir. Codigo:

u s i n gS y s t e m ; u s i n gS y s t e m . C o l l e c t i o n s . G e n e r i c ; u s i n gS y s t e m . C o m p o n e n t M o d e l ; u s i n gS y s t e m . D a t a ; u s i n gS y s t e m . D r a w i n g ; u s i n gS y s t e m . T e x t ; u s i n gS y s t e m . W i n d o w s . F o r m s ; n a m e s p a c eW i n d o w s A p p l i c a t i o n 1 { p u b l i cp a r t i a lc l a s sE l i m i n a c i o n:F o r m { p u b l i cE l i m i n a c i o n ( ) { I n i t i a l i z e C o m p o n e n t ( ) ; } p r i v a t ev o i dc m d E l i m i n a r _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { s t r i n ge l e m e n t o=t x t d a t o . T e x t ; i n ta u x ,l u g=9 9 9 ,l u g p=0 ,p t r ; t x t d a t o . C l e a r ( ) ; i f( L i s t a s . c o m i e n z o= =9 9 9 ) { l u g=9 9 9 ; l u g p=9 9 9 ; M e s s a g e B o x . S h o w ( " L al i s t ae s t av a c i a " ," E r r o r " ) ; r e t u r n ; } i f( L i s t a s . a l u m n o [ L i s t a s . c o m i e n z o ]= =e l e m e n t o ) { l u g=L i s t a s . c o m i e n z o ; l u g p=9 9 9 ; L i s t a s . c o m i e n z o=L i s t a s . e n l a c e [ L i s t a s . c o m i e n z o ] ; } e l s e { a u x=L i s t a s . c o m i e n z o ; p t r=L i s t a s . e n l a c e [ L i s t a s . c o m i e n z o ] ; w h i l e( p t r! =9 9 9 ) { i f( L i s t a s . a l u m n o [ p t r ]= =e l e m e n t o ){l u g=p t r ;l u g p=a u x ;} a u x=p t r ;p t r=L i s t a s . e n l a c e [ p t r ] ; } } i f( l u g= =9 9 9 ){M e s s a g e B o x . S h o w ( " E l e m e n t on oe n c o n t r a d o " ," E r r o r " ,M e s s a g e B o x B u t t o n s . O K ) ;r e t u r n ;} i f( l u g p= =9 9 9 ){L i s t a s . c o m i e n z o=L i s t a s . e n l a c e [ L i s t a s . c o m i e n z o ] ;} e l s e{L i s t a s . e n l a c e [ l u g p ]=L i s t a s . e n l a c e [ l u g ] ;} L i s t a s . e n l a c e [ l u g ]=L i s t a s . d i s p o n i b l e ;L i s t a s . d i s p o n i b l e=l u g ; M e s s a g e B o x . S h o w ( " E l e m e n t ob o r r a d o " ," P r o c e s oC o m p l e t a d o " ) ; b u t t o n 1 . T e x t=" C e r r a r " ; } p r i v a t ev o i db u t t o n 1 _ C l i c k ( o b j e c ts e n d e r ,E v e n t A r g se ) { t h i s . C l o s e ( ) ; } } }

Corrida

http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas

10/11

11/3/2014

LISTAS ENLAZADAS ESTRUCTURA DATOS C#

Buscar

13.2K

13
Like

Politica de Privacidad

http://www.programacionfacil.com/estructura_datos_csharp:listas_enlazadas

11/11

You might also like