Transparencias

Anuncio
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
Descargar