Corrigé 4. Enoncé
1. Différence de deux listes linéaires chaînées
Soit le prédicat Exist(Val, L) égal à VRAI si l'élément Val appartient à la liste L,
FAUX Sinon. Soit S le type d'un maillon.
Le prédicat Exist peut être défini comme suit :
Exist := FAUX
P := L
TANTQUE P <> NIL ET NON Exist :
SI Valeur(P) = Val
Exist := VRAI
SINON P := Suivant(P) FSI
FINTANTQUE
Différence de 2 listes
L'algorithme qui construit la différence de deux listes L1
et L2 est le suivant ( L3 constitue la liste résultante) :
L3 := NIL
P := L1
Q := NIL
TANTQUE P <> NIL :
SI NON Exist( Valeur(P), L2)
R := Q
Allouer ( Q,S)
Aff_Val( Q, Valeur(P) )
Aff_Adr(Q, NIL)
SI R <> NIL
Aff_Adr(R,Q)
SINON L3 := Q FSI
FSI
P := Suivant (P)
FINTANTQUE
2. Files d'attente en représentation contigu�
La file d'attente est représentée par un tableau géré de façon circulaire. Tête est
l'indice de l'élément qui précède le premier. Queue pointe le dernier élément de la
file d'attente. La file d'attente est schématisée comme suit :
Structure de données
TYPE Typefiledattente = STRUCTURE
Tab
: TABLEAU(1..N) DE Typeqq
Tête, Queue : ENTIER
Vide
: BOOLEEN
FIN
Traduction des opérations du modèle dans cette représentation
Créerfile (F) : F.Tête, F.Queue := N {Ou
n'importe quelle valeur dans [1..N]}
F.Vide := VRAI
Filevide(F) : Filevide :=
(F.Tête = F.Queue) ET F.Vide
Filepleine(F) : Filepleine := (F.Tête =
F.Queue) ET NON F.Vide
Enfiler( F, Val) : SI NON Filepleine (F)
F.Queue := F.Queue Mod N + 1
F.Tab( F.Queue) := Val
SI F.Queue = F.Tête : F.Vide := FAUX FSI
SINON " Overflow "
FSI
Défiler(F, Val) : SI NON Filevide(F)
F.Tête := F.Tête Mod N + 1
Val := F.Tab (F.Tête)
SI F.Tête = F.Queue : F.Vide := VRAI FSI
SINON " Underflow
" FSI
3. Implémentation de file/ pile de piles/files d'attente.
File d'attente de piles
Un schéma possible peut être le suivant :
Explication :
La file d'attente est implémentée par une liste linéaire chaînée. Elle est donc
définie par le couple(Tête, Queue). Chaque élément de cette liste est une pile
représentée en contigu. On a donc une file d'attente de piles.
Structures de données :
{ Pile en représentation statique }
TYPE Typepile = STRUCTURE
Tab : TABLEAU (1..N) DE Typeqq
Sommet : ENTIER
FIN
{ Un maillon de la file d'attente }
TYPE S = STRUCTURE
Pile : Typepile
Suivant : POINTEUR(S)
FIN
{File d'attente en représentation dynamique}
TYPE Typefiledattente = STRUCTURE
Tête, Queue : POINTEUR(S)
FIN
Les opérations sont traduites comme suit :
F est une variable de type Typefiledattente; Val est une variable de type Typepile.
Créerfile(F)
: F.Tête := NIL
Filevide(F)
: Filevide := (F.Tête = NIL)
Enfiler(F, Val) :
Allouer (Q, S)
Aff_Adr(Q,NIL)
Aff_Val(Q, Val)
SI NON Filevide (F)
Aff_Adr(F.Queue, Q)
SINON F.Tête := Q FSI
F.Queue := Q
Défiler (F, Val) : SI NON
Filevide(F)
R :=
F.Tête
Val :=
Valeur(F.Tête)
F.Tête := Suivant(F.Tête)
Libérer(R)
SINON " Underflow
" FSI
Pile de piles
Un schéma possible
Explication :
La pile principale est implémentée par un tableau. Chaque élément de ce tableau est un
pointeur. Ce dernier désigne une pile implémentée par une liste linéaire chaînée. On
a donc une pile de piles.
Structures de données :
{ Un maillon de la pile secondaire }
TYPE S = STRUCTURE
Element : Typeqq
Suivant : POINTEUR(S)
FIN
{Pile principale en représentation contigue }
TYPE Typepile = STRUCTURE
Tab
: TABLEAU(1..N) DE POINTEUR(S)
Sommet : ENTIER
FIN
Pile de files d'attente
Un schéma possible :
Explication :
La file d'attente est implémentée par une liste linéaire chaînée, donc définie par
le couple ( Tête, Queue). La pile est implémentée par un tableau o� chaque élément
est un couple caractérisant une file d'attente. On a donc bien une pile de files
d'attente.
Structures de données :
{ Un maillon de la file d'attente }
TYPE S = STRUCTURE
Element : Typeqq
Suivant : POINTEUR(S)
FIN
{ File d'attente en représentation dynamique }
TYPE Typefiledattente = STRUCTURE
Tête, Queue : POINTEUR(S)
FIN
{ Pile en représentation statique }
TYPE Typepile = STRUCTURE
Tab
: TABLEAU(1..N) DE Typefiledattente
Sommet : ENTIER
FIN