Corrigé 2. Enoncé
1. Files d'attente
Le modèle des files d'attente est l'ensemble suivant :
Modèle = { Creerfile(F), Filevide(F), Enfiler(F, Val), Defiler(F, Val) }
Définition du type file d'attente
TYPE S = STRUCTURE
Element : Typeqq
Suiv : POINTEUR(S)
FIN
TYPE Filedattente = STRUCTURE
Tete, Queue : POINTEUR(S)
FIN
Implémentation au moyen des listes linéaires chaînées
çà revient à traduire les opérations du modèle de file d'attente au moyen des
opérations du modèle des listes linéaires chaînées.
Creerfile ( F ) : F.Tete := NIL
Filevide( F) : Filevide
:= ( F.Tete = NIL )
Enfiler (F , Val) : Allouer (P, S)
Aff_Val(P, Val)
Aff_Adr(P, NIL)
SI NON Filevide(F) :
Aff_Adr(F.Queue, P)
SINON
F.Tete := P
F.Queue := P
FSI
Defiler ( F, Val) : SI NON Filevide(F)
P := F.Tete
Val := Valeur(F.Tete)
F.Tete := Suivant(F.Tete)
Liberer(P)
SINON " Underflow" FSI
2. Parcours d'un arbre ternaire
Modèle
Chaque noeud peut avoir 3 fils : fils gauche, fils centre( par exemple) et fils droit.
Le modèle sur les arbres ternaires peut être défini comme suit :
Modèle = { Creernoeud(Val), Liberer(N), Info(N), Aff_info(N, Val), Fg(N), Fc(N), Fd(N),
Aff_fg(N, M), Aff_fc(N, M), Aff_fd(N, M) }
Les opérations sont réparties en classes comme suit :
Allocation : Creernoeud(Val)
Libération : Liberernoeud(N)
Consultation : Info(N), Fg(N), Fd(N), Fc(N)
Mise à jour : Aff_fg(N, M), Aff_fc(N, M), Aff_fd(N, M)
Algorithme de parcours d'un arbre ternaire niveau par niveau
En entrée : un arbre non vide de racine Racine.
En sortie : la liste des noeuds de l'arbre niveau par niveau.
L'algorithme utilise une file d'attente F.
" Info(Racine) "
Creerfile(F)
Enfiler(F, Racine)
TANTQUE NON Filevide(F) :
Defiler(F, Noeud)
" Info(Noeud) "
Enfiler(Fg(Noeud)
Enfiler(Fc(Noeud)
Enfiler(Fd(Noeud)
FINTANTQUE
3. Listes linéaires chaînées en représentation contigu�
Définition de la structure
TYPE T = STRUCTURE
Info : Typeqq
Lien : ENTIER
Vide : BOOLEEN {
Position vide }
FIN
VAR T : TABLEAU ( 1 : Max ) DE T ;
Initialement les champs Vide de tous les éléments sont à VRAI. ( pour indiquer des
positions disponibles)
L'indice -1 représente NIL.
Une liste sera définie par l'indice de son premier élément dans le tableau T.
L'implémentation du modèle de listes linéaires chaînées au moyen de tableaux revient
à traduire les opérations du modèle de listes linéaires chaînées au moyen du modèle
sur les tableaux avec la seule opération d'indexation.
Le module Allouer ( P ) rend dans P l'indice d'une position vide sinon la valeur -1 ( s'il
n y a pas de place ). Ceci revient à chercher une entrée libre P dans le tableau T. Une
solution simple consiste à balayer le tableau linéairement du début vers la fin
jusqu'à la rencontre d'une entrée libre.
I := 1 ; Trouv := FAUX
TANTQUE I <= Max ET NON Trouv :
SI T(I).Vide : Trouv :=
VRAI
SINON I := I + 1 FSI
FINTANTQUE
SI NON Trouv : P := - 1 { ou NIL }
SINON
P := I
T(I).Vide := FAUX
FSI
Les autres opérations en bref :
Libérer(P) : T(P).vide := VRAI
Valeur(i) : valeur := t(i).info
Suivant(I) : Suivant := T(I).Lien
Aff_Adr(I,J) : T(I).Lien := J
Aff_val(i, val): t(i).info := val
Recherche d'un élément
En entrée : la liste I et l'élément Elément à rechercher.
En sortie : Trouv ( existence de l'élément )
Si Trouv est VRAI
- P : indice de l'élément recherché,
- Q : indice de l'élément qui précède l'élément recherché.
Si Trouv est FAUX
- Q : indice du dernier élément de la liste.
L'algorithme est le suivant :
Q := NIL
Trouv := FAUX
P := I { Tête de liste }
TANTQUE P <>NIL ET NON Trouv :
SI Valeur(P) = Element
Trouv := VRAI
SINON
Q := P ; P :=
Suivant(P)
FSI
FINTANTQUE
Insertion d'un élément en fin de liste
En entrée : la liste I et l'élément Elément à insérer
En sortie : la liste I avec l'élément Elément inséré à la fin.
Recherche( I, Elément, Trouv, Q, P)
SI NON Trouv :
Allouer( R)
SI R <> NIL
Aff_Adr( Q, R)
Aff_Val(R, Element)
Aff_Adr(R,, NIL)
SINON "Debordement" FSI
SINON "Double" FSI
Supprimer un élément donné de la liste
En entrée : la liste I et l'élément Elément à supprimer.
En sortie : la liste I avec l'élément Elément supprimé.
Recherche(I, Element, Trouv, Q, P) :
SI Trouv :
R := P
SI Q <> NIL
Aff_Adr(Q, Suivant(P))
SINON
R := I
I:= Suivant(I) { C'est
le premier élément }
FSI
Liberer ( R)
SINON " L'élément n'existe pas " FSI