Corrigé 15. Enoncé
1. Arbre de listes linéaires chaînées
Dans ce qui suit, cc désigne une chaîne de caractères et llc une liste linéaire
chaînée.
a) Module CréerList (C, L)
Crée la llc L à partir de la cc C.
Soit S le type d'un maillon et Q une variable de type POINTEUR.
L := NIL
POUR I=1, Long(C)
Allouer(Q, S)
Aff_Val(Q, C(I) )
Aff_Adr(Q, NIL)
SI L # NIL : Aff_Adr(P, Q) SINON L := Q FSI
P := Q
FINPOUR
b) Module CréerChaîne (L, C)
Crée la cc C à partir de la llc L.
Q étant une variable de type POINTEUR.
Q := L ; I := 0
TANTQUE Q # NIL :
I := I + 1
C(I) := Valeur(Q)
Q := Suivant(Q)
FINTANTQUE
c) Module de Recherche-Insertion
On commence par définir le module Recherche (L, C, Trouv, Sauv) qui
recherche la cc C dans la llc L. Si C n'est pas trouvée, Trouv prend la valeur FAUX et
Sauv pointe une feuille.
Q étant une variable de type POINTEUR.
Q := L
Trouv := FAUX
TANTQUE Q # NIL ET NON Trouv :
Sauv := Q
Créerchaîne( Valeur(Q), Chaîne)
SI Chaîne = C :
Trouv := VRAI
SINON
SI Chaîne < C : Q
:= Fd(Q)
SINON Q := Fg(Q) FSI
FSI
FINTANTQUE
Le module d'insertion est alors le suivant :
P et R étant des variables de type POINTEUR.
Recherche (L, C, Trouv, Sauv)
SI NON Trouv :
Créerlist(C, P)
R := Créernoeud(P)
SI C < Chaîne : Aff_Fg(Sauv, R)
SINON Aff_Fd(Sauv, R) FSI
SINON " C existe " FSI
d) Module récursif d'impression de toutes les chaînes de
caractères en ordre croissant
Il s'agit de faire un parcours en " inordre ". A étant la racine de l'arbre.
Imprimer( A )
SI A # NIL :
Imprimer(Fg( A ))
Créerchaîne(A, C) ; Ecrire( C)
Imprimer( Fd(A) )
FSI
e) Algorithme récursif qui détermine le pourcentage d'octets
utilisés par rapport à l'encombrement mémoire total sachant qu'un pointeur occupe 2
octets
Xg, Xd ( des réels ) et Tg, Td ( des entiers ) désignent des variables globales au
module récursif suivant :
Pourcentage ( A, Taille, P ) :
SI A = NIL :
Taille := 0 ; P := 0
SINON
Pourcentage( Fg(A), Tg,Xg)
Pourcentage ( Fd(A), Td, Xd)
Taille := (6 + Longueur(Info(A)) *3 ) + Tg + Td
P := ( Longueur(Info(A)) + Xg*Tg + Xd*Td ) /
Taille
FIN
f) Au moment de la visite "inordre" d'un noeud, la
pile contient uniquement les noeuds par lesquels on "sort" par la gauche.
g) Dans le module de recherche, on ajoute tout simplement
l'opération Empiler (Pile, N) avant l'affectation " Q := Fg(Q) "
h) Algorithme qui imprime toutes les cc commençant par un
caractère C donné
Soient :
- P : le pointeur de la plus petite chaîne de caractères commençant par le caractère C
si elle existe déterminée par le module de recherche.
- Pile : la pile contenant les noeuds par lesquels l'algorithme de recherche " se
dirige " par la gauche.
Q étant une variable de type POINTEUR, Continue une variable booléenne.
Continue := VRAI
TANTQUE Continue :
Q := Fd(P)
SI Q # NIL :
TANTQUE Fg(Q) # NIL :
Empiler( Pile, Q )
Q := Fg(Q)
FINTANTQUE
{ Q est le pointeur du
prochain noeud }
SI Valeur( Info(Q) ) =
C :
Créerchaîne( Info(Q), C)
Ecrire(C)
SINON Continue := FAUX
FSI
SINON
Dépiler( Pile, N,
Possible)
SI Possible :
SI Valeur( Info(Q) ) = C :
Créerchaîne( Info(Q), C)
Ecrire(C)
SINON Continue := FAUX FSI
SINON
Continue := FAUX
FSI
FSI
FINTANTQUE