Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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
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.
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