Ejercicio 3.9. Supongamos que el diccionario se implementa como un puntero al siguiente tipo nodo, que genera una representación poco eficiente en donde abundan tuplas llenas de punteros nil: type nodo = tuple letra : char def : char char a : pointer to node char b : pointer to node char c : pointer to node .. . En tal caso la estructura del algoritmo de búsqueda serı́a simple: mientras no se agoten los caracteres de la palabra w, hagamos descender p por la rama que corresponde al primer caracter de w. Si llegamos a p = nil entonces no hay definición para tal palabra, y si agotamos todos los caracteres arribando a una tupla definida (o sea p 6= nil) entonces en el campo p → def apunta al significado buscado (que eventualmente también puede ser nil). func def inición(p : pointer to nodo, w : palabra) dev pointer to signif icado while p 6= nil ∧ w 6= [] do if head(w) = ’a’ → p := p → char a ¤ head(w) = ’b’ → p := p → char b .. . fi w := tail(w) if p 6= nil then return(p → def ) if p = nil then return(nil) Para nuestro caso sólo debemos reemplazar el if del interior del ciclo por un programa que búsque el puntero descendiente correspondiente al caracter en cuestión. Para esto inicializamos p mediante p → primerHijo, y luego recorremos la lista de hermanos. p := p → primerHijo while p 6= nil ∧ head(w) 6= p → letra do p := p → hermano Luego el algoritmo completo es: func def inición(p : pointer to nodo, w : palabra) dev pointer to signif icado while p 6= nil ∧ w 6= [] do p := p → primerHijo while p 6= nil ∧ head(w) 6= p → letra do p := p → hermano 1 w := tail(w) if p 6= nil then return(p → def ) if p = nil then return(nil) 2