Anda di halaman 1dari 6

Estructuras dinmicas lineales

Introduccin
Contina la exposicin de los distintos algoritmos existentes para manipular listas simplemente enlazadas; sin el leccin anterior se presentaban algoritmos iterativos, en sta se vern en su versin recursiva.

Implementacin de listas simplemente enlazadas en la notacin algortmica Operaciones sobre listas (simplemente enlazadas) implementadas recursivamente
Recorrido de una lista simplemente enlazada (de forma recursiva)
accin recorrer (cabezaLista puntero a nodo) inicio si cabezaLista NIL entonces escribir cabezaLista .numero llamar recorrer (cabezaLista .siguiente) fin si fin accin

En el algoritmo que se presenta el caso base podra decirse que es elptico1 puesto que ninguna accin se debe realizar para recorrer una lista vaca; as, slo aparece el caso recursivo que se limita a imprimir el contenido de la cabeza de la lista recibida y procede a recorrer el resto de la lista (una lista cuya cabeza es el elemento que sigue al actual). A continuacin se muestra de forma grfica el recorrido recursivo de una lista con los nmeros 1, 2 y 3:
llamar recorrer (lista)
2 3 lista 1 NIL

inicio si cabezaLista NIL entonces escribir cabezaLista-.numero llamar recorrer (cabezaLista .siguiente) fin si fin accin La primera invocacin de la accin imprime el contenido de la cabeza de la lista (1) y invoca de nuevo la accin para el resto de la lista.
3 lista 2 NIL

inicio si cabezaLista NIL entonces escribir cabezaLista-.numero llamar recorrer (cabezaLista .siguiente) fin si fin accin La segunda invocacin imprime el contenido de la cabeza de la lista, en este caso el resto de la lista anterior, con lo cual aparece por pantalla el nmero 2 y se invoca nuevamente la accin para el resto de la lista.
lista 3 NIL

inicio si cabezaLista NIL entonces escribir cabezaLista-.numero llamar recorrer (cabezaLista .siguiente) fin si fin accin La tercera invocacin imprime el contenido de la cabeza de la lista, en este caso el resto del resto de la lista anterior, mostrndose el nmero 3 e invocando la accin para el resto de la lista.
lista NIL

inicio si cabezaLista NIL entonces escribir cabezaLista .numero

llamar recorrer (cabezaLista .siguiente) fin si fin accin Esta cuarta invocacin recibe una lista vaca, por tanto, no hace nada y retorna a la tercera invocacin que finaliza y retorna a la segunda que, a su vez, finaliza y retorna a la primera invocacin que tambin finaliza y devuelve el control al programa principal.
1 Elipsis:

figura de construccin que consiste en omitir en la oracin palabras que no son indispensables para la claridad del sentido. Leccin 11 Estructuras dinmicas lineales (ii) 2

Bsqueda de un elemento en una lista simplemente enlazada (de forma recursiva)


La operacin de bsqueda se basa en la de recorrido; bsicamente se trata de recorrer la lista hasta que se encuentre el elemento o se llegue al final, retornando un puntero al elemento encontrado (o NIL en caso contrario).
puntero a nodo funcin buscar (cabezaLista puntero a nodo, elemento inicio si cabezaLista NIL entonces si cabezaLista .numero = elemento entonces buscar cabezaLista si no llamar buscar (cabezaLista .siguiente,elemento) fin si si no buscar NIL fin si fin accin entero)

Insercin de un elemento en una lista simplemente enlazada


Al igual que en la leccin anterior, se proceder a implementar las operaciones de insercin en una cola y en una lista ordenada ascendentemente; la insercin en una pila no se puede implementar de forma recursiva puesto que es un problema que no consiste en una repeticin de pasos. Insercin en una cola (de forma recursiva) Como ya se ha dicho, la insercin en una cola precisa buscar el ltimo elemento de la lista e insertar el nuevo elemento detrs del mismo.
accin insertarCola (cabezaLista puntero a nodo, dato_nuevo inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin entero)

A continuacin se muestra de forma grfica la insercin del nmero 3 en una lista que ya contiene los enteros 1 y 2:
insertarCola (lista, 3)
2 lista 1 NIL

inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista-.siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin En la primera invocacin se comprueba que la cola no est vaca por lo que se procede a insertar, recursivamente, el elemento en el resto de la cola (2).
lista 2 NIL

inicio

si cabezaLista NIL entonces llamar insertarCola (cabezaLista-.siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin En la segunda invocacin se comprueba que la cola no est vaca por lo que se invoca recursivamente la accin para insertar el elemetno.
Leccin 11 Estructuras dinmicas lineales (ii) 3
lista NIL

inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin En la tercera invocacin la cola est vaca, por tanto, es posible crear un nuevo elemento.
lista

inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin El nuevo elemento es creado.
lista NIL

inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista-.siguiente NIL cabezaLista .numero dato fin si fin accin El nuevo elemento es el primero y el ltimo de su cola.
lista 3 NIL

inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista-.numero dato fin si fin accin Se asigna un valor al nuevo elemento y se retorna desde la tercera invocacin a la segunda.
3 lista 2 NIL

inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin La segunda invocacin ya ha insertado, recursivamente, el nuevo elemento as que puede retornar a la primera.
2 3

lista 1 NIL

inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin La primera invocacin ha logrado insertar, recursivamente, el nuevo elemento por lo que puede devolver el control al programa principal.

Insercin en una lista ordenada ascendentemente (de forma recursiva)


accin insertarOrdenado (cabezaLista puntero a nodo, dato variables nuevo puntero a nodo inicio si cabezaLista NIL entonces si cabezaLista .numero dato entonces crear (nuevo) nuevo .siguiente cabezaLista .siguiente cabezaLista .siguiente nuevo nuevo .numero cabezaLista .numero cabezaLista .numero dato si no llamar insertarOrdenado (cabezaLista .siguiente,dato) fin si si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin entero)

Eliminar un elemento de una lista simplemente enlazada (de forma recursiva)


El algoritmo bsico de eliminacin simplemente debe recorrer la lista hasta encontrar el dato a eliminar, enlazar la lista de forma adecuada y destruir el nodo sobrante.
accin eliminarElemento (cabezaLista puntero a nodo, dato variables cursor puntero a nodo inicio si cabezaLista NIL entonces si cabezaLista .numero = dato entonces si cabezaLista .siguiente NIL entonces cursor cabezaLista .siguiente cabezaLista .numero cursor .numero cabezaLista .siguiente cursor .siguiente destruir (cursor) si no destruir (cabezaLista) fin si si no si cabezaLista .siguiente NIL entonces si cabezaLista .siguiente .numero = dato entonces cursor cabezaLista .siguiente cabezaLista .siguiente cursor .siguiente destruir (cursor) si no llamar eliminarElemento (cabezaLista .siguiente,dato) fin si fin si fin si fin si fin accin entero)

Vaciado de una lista simplemente enlazada (de forma recursiva)


accin vaciarLista (cabezaLista puntero a nodo) inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin

Para vaciar una lista simplemente enlazada de forma recursiva basta con vaciar el resto de la lista, si es que existe, y despus eliminar el nodo que se encuentra en la cabeza. A continuacin se muestra de forma grfica el vaciado recursivo de la lista que contiene los nmeros 1, 2 y 3.
llamar vaciarLista (lista)
Leccin 11 Estructuras dinmicas lineales (ii) 5
2 3 lista 1 NIL

inicio si cabezaLista-.siguiente NIL entonces llamar vaciarLista (cabezaLista-.siguiente) fin si destruir(cabezaLista) fin accin En la primera invocacin se debe vaciar el resto de la lista (2 y 3).
3 lista 2 NIL

inicio si cabezaLista-.siguiente NIL entonces llamar vaciarLista (cabezaLista-.siguiente) fin si destruir(cabezaLista) fin accin En la segunda invocacin se debe vaciar el resto de la lista (3).
lista 3 NIL

inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin En la tercera invocacin no hay resto de lista con lo cual se destruye la cabeza (3).
lista

inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin Una vez destruida la cabeza de la lista en la tercera invocacin se retorna a la segunda.
lista 2

inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin En la segunda invocacin ya se ha vaciado el resto de la lista, por lo que se puede destruir la cabeza (2).
lista

inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin Destruida la cabeza de la lista de la segunda invocacin se puede retornar a la primera.

lista 1

inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin Al haberse vaciado el resto de la lista en la primera invocacin se elimina la cabeza.
lista

inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin La primera invocacin ha destruido todos los elementos de la cola a partir del segundo y, despus, la cabeza. Una vez hecho esto retorna al programa principal

Anda mungkin juga menyukai