Algorítmica y Lenguajes de Programación Estructuras dinámicas lineales (ii) Estructuras dinámicas lineales (ii). Recorrido recursivo n n En este algoritmo sólo aparece el caso recursivo que imprime el contenido de la cabeza de la lista recibida y recorre el resto de la lista. El caso base no figura puesto que es la acción a realizar cuando la lista está vacía que es “no hacer nada”. acción recorrer (cabezaLista ∈ puntero a nodo) inicio si cabezaLista ≠ NIL entonces escribir cabezaLista↑ ↑ .numero llamar recorrer (cabezaLista↑ ↑ .siguiente) fin si fin acción 2 1 Estructuras dinámicas lineales (ii). Búsqueda recursiva n La operación de búsqueda se basa en la de recorrido; básicamente 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 función buscar ( cabezaLista ∈ ∈ puntero a nodo, elemento ∈ ∈ entero) 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 acción 3 Estructuras dinámicas lineales (ii). Inserción recursiva en una cola n La inserción en una cola precisa buscar el último elemento de la lista e insertar el nuevo elemento detrás del mismo. acción insertarCola (cabezaLista ∈ ∈ puntero a nodo, dato_nuevo ∈ ∈ entero) inicio si cabezaLista ≠≠ NIL entonces llamar insertarCola (cabezaLista↑ ↑ .siguiente,dato_nuevo) si no crear ( cabezaLista) cabezaLista↑ ↑ .siguiente ß ß NIL cabezaLista↑ ↑ .numero ß ß dato fin si fin acción 4 2 Estructuras dinámicas lineales (ii). Inserción recursiva en una lista ordenada acción insertarOrdenado (cabezaLista ∈ ∈ puntero a nodo, dato ∈ ∈ entero) 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 acción 5 Estructuras dinámicas lineales (ii). Destrucción recursiva de una lista n Para vaciar una lista simplemente enlazada de forma recursiva basta con vaciar el resto de la lista, si es que existe, y después eliminar el nodo que se encuentra en la cabeza. acción vaciarLista (cabezaLista ∈ puntero a nodo) inicio si cabezaLista↑ ↑ .siguiente ≠ NIL entonces llamar vaciarLista (cabezaLista↑ ↑ .siguiente) fin si destruir(cabezaLista) fin acción 6 3 Estructuras dinámicas lineales (ii). Eliminar un elemento de una lista de forma recursiva (i) n Debe recorrer la lista hasta encontrar el dato a eliminar, enlazar la lista de forma adecuada y destruir el nodo sobrante. acción eliminarElemento (cabezaLista ∈ ∈ puntero a nodo, dato ∈ ∈ entero) 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 [CONTINUA...] 7 Estructuras dinámicas lineales (ii). Eliminar un elemento de una lista de forma recursiva (ii) [CONTINUA...] 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 acción 8 4