exercices corrigés d'algorithmique
DESCRIPTION
exercices corrigés d'algorithmiqueTRANSCRIPT
-
!"#$%&'()&('*(()&+%, !'!(-(()&+%,
Anne Universitaire : 20082009
-
Page 1 sur 53
!"#"
e fascicule des travaux dirigs dalgorithmique et structures de donnes II est
lintention des tudiants de la premire anne en Licence en Informatique Applique
la Gestion de la Facult des Sciences Juridiques, conomique et de Gestion de
Jendouba. Il aborde brivement les thmes les plus classiques et les plus utiliss en informatique :
les enregistrements, les fichiers, la rcursivit, les listes chaines, les piles, les files et les arbres
binaires de recherche.
Le fascicule comporte 5 TD avec leurs corrections qui sont rparties comme suit :
TD1 : Les enregistrements et les fichiers
TD2 : La rcursivit
TD3 : Les listes chaines
TD4 : Les piles et les files
TD5 : Les arbres binaires de recherche
Une fois que ltudiant obtenue une connaissance suffisante sur la manipulation des types
simples, dans ce fascicule nous dbuterons par un TD1 qui est consacr pour la manipulation des
types complexes(les enregistrements), et sur les fichiers squentiels. Ltudiant sera capable la
fin du TD1 manipuler les fichiers.
Dans le TD2, nous traiterons les sousprogrammes rcursifs, nous allons voir de plus prs le
mcanisme de transformation dun programme itrative en un programme rcursif. Ltudiant
dans ce TD doit savoir excuter la main en utilisant une pile.
Aprs avoir traiter les programmes en version rcursifs, le TD3 sera sur lallocation dynamique
aprs avoir vu au part avant lallocation statique. Dans ce TD nous traiterons les listes chaines que
ce soit simple, double ou circulaire. Ltudiant doit apprendre crer une liste, la parcourir et
enfin savoir comment supprimer un lment.
Le TD4 est une suite du prcdent, vu quil sagit dune liste chaine avec des stratgies daccs,
pour les piles, ils utilisent la stratgie (Last In First Out) et pour les files (First In First out). Nous
dfinirons les diffrents sousprogrammes qui seront utiles pour manipuler ces derniers.
A la fin nous entamerons le TD5 qui sera consacr pour la manipulation des arbres binaires de
recherche. Nous allons traiter dans celuil les diffrents algorithmes avancs : la rotation, la
fusion, la vrification dun arbre sil est parfait, dgnr,
Enfin, nous esprons que le prsent ouvrage aura le mrite dtre un bon support pdagogique
pour lenseignant et un document permettant une concrtisation exprimentale pour ltudiant.
!$%"$
!$&'()%
-
Page 2 sur 53
*
+,$-......................................................................................../
#+............................................................................................................................0
+1,!-............................................................................................................................1
#+1..........................................................................................................................2
+/,$-..............................................................................................................13
#+/..........................................................................................................................11
+2,-...............................................................................................................//
#+2........................................................................................................................../2
+0,**$$-................................................................................................./4
#+0..........................................................................................................................23
&&'! 5"....................................................................................................................................0/
-
Page 3 sur 53
+,$-
,$-
'*6
"7"!##"8+
Crer un enregistrement nomm " qui est caractris par un , un
et un .
On vous demande de saisir 10 tudiants, les ranger dans un tableau puis les afficher.
"7"!##"8+1
On reprend lexercice prcdent mais on rajoute en plus pour chaque tudiant ses deux
notes. On vous demande de crer le nouvel enregistrement nomm 8 qui est
caractris par NoteCc (Note de contrle continu) et NoteEx (Note dexamen).
Modifier lenregistrement " afin quelle puisse tre en relation avec
lenregistrement 8 .
On vous demande de crer :
Une procdure de saisi des tudiants ainsi leurs notes.
Une procdure daffiche des tudiants avec leurs notes.
Une fonction qui renvoie ltudiant qui a eu la meilleure note dexamen.
Une fonction qui renvoie la moyenne gnrale de la classe.
0.3 0.7
Afficher la meilleure note dexamen et la moyenne gnrale de la classe.
9crire le programme principal faisant appel aux diffrents sousprogrammes.
"7"!##"8+/
On souhaite mmoriser des noms des personnes dans un fichier nomm ..
On vous demande alors de crer les sousprogrammes qui suivent :
Une procdure de cration du fichier qui contient les noms des personnes.
Une procdure daffichage des noms de personnes.
Une fonction qui permet de chercher un nom pass en argument et qui renvoie
vrai si ce dernier est existant et faux sinon.
Une procdure qui copie les noms sans compter le nom pass en paramtre.
9crire le programme principal faisant appel aux diffrents sousprogrammes.
):;":*
(133?@)1
%
On souhaite mmoriser les tudiants de la facult ainsi que leurs notes dans un fichier
nomm $. . Un tudiant est caractris par un , un et un
. Chaque tudiant aura deux notes : une note de contrle contenu et une note
dexamen.
NoteMax Alors
NoteMax T[i].Note.NoteEx
Fin Si
Fin Pour
MeilleureNote NoteMax
Fin
Fonction MoyenneGnrale(m : Entier ; T : TAB) : Rel
Var
i : Entier
som : Rel
Dbut
som 0
Pour i de 2 m Faire
som som + 0.3 x T[i].Note.noteCc + 0.7 x T[i].Note.noteEx
Fin Pour
MoyenneGnrale som / m
Fin
Dbut
n 10
Remplissage(n,ET)
Affichage(n,ET)
Ecrire("Meilleur note examen :", MeilleureNote(n,ET),
" Moyenne gnrale de la classe :", MoyenneGnrale(n,ET))
Fin
-
Page 8 sur 53
"7"!##"8+/
Algorithme TraiTFichNom
Type
Nom : chaine[30]
FichNoms : Fichier de Nom
Var
F1,F2 : FichNoms
Procdure Cration(Var fn : FichNoms) Var
n : Nom rep : caractre
Dbut Ouvrir(fn,E) rep O Tant que MAJUS(rep) = O Faire
Ecrire(Nom : ), Lire(n) Ecrire(fn,n)
Ecrire(Voulez*vous ajouter un autre nom (O/N) : ) Lire(rep)
Fin Tant que Fermer(fn)
Fin
Procdure Affichage(fn : FichNoms) var
n : Nom Dbut
Ouvrir(fn,L) Lire(fn,n) Tant que NON(FinDeFichier(fn)) Faire
Ecrire(n) Lire(fn,n)
Fin Tant que Fermer(fn)
Fin
Fonction Recherche(x : Nom ; fn : FichNoms) : Boolen
var n : Nom Trouve : Boolen
Dbut Ouvrir(fn,L) Lire(fn,n) Trouve (n = x) Tant que Trouve=faux ET NON(FinDeFichier(fn)) Faire
Lire(fn,n) Trouve (n = x)
Fin Tant que Si FinDeFichier(fn) Alors Recherche faux Sinon Recherche vrai Fin Si Fermer(fn)
Fin
-
Page 9 sur 53
"7"!##"8+2
Procdure Copier(x : Nom ; fn : FichNoms ; var ft : FichNoms) var
n : Nom
Dbut Ouvrir(fn,L) Ouvrir(ft,E) Lire(fn,n) Tant que n x ET NON(FinDeFichier(fn)) Faire Ecrire(ft,n)
Lire(fn,n) Fin Tant que Si NON(FinDeFichier(fn)) Alors Lire(fn,n) Tant que NON(FinDeFichier(fn)) Faire Ecrire(ft,n)
Lire(fn,n) Fin Tant que
Fin Si Fermer(fn) Fermer(ft)
Fin
Dbut
Cration(F1)
Affichage(F1)
Si Recherche("Riadh",F1) Alors
Ecrire("Riadh est existant dans le fichier")
Sinon
Ecrire("Riadh est non existant dans le fichier")
Fin Si
Copier("Riadh",F1,F2)
Affichage(F2)
Fin
Algorithme GesEtudFichier
Type
Notes : Enregistrement
noteCc : Rel
noteEx : Rel
Fin Notes
Etudiant : Enregistrement
Ident : Entier
Nom : chaine[30]
Prnom : chaine[20]
Note : Notes
Fin Etudiant
TAB : Tableau de 100 Etudiant
FichEtud : Fichier de Etudiant
-
Page 10 sur 53
Var
Fe,Fr : FichEtud
Procdure SaisiNotes(var E : Etudiant)
Var
noteEntrer : Rel
Dbut
Rpter
Ecrire("Note contrle contenu : "),Lire(noteEntrer)
Jusqu noteEntrer 0 ET noteEntrer 20
E.Note.NoteCc noteEnter
Rpter
Ecrire("Note examen : "), Lire(noteEntrer)
Jusqu noteEntrer 0 ET noteEntrer 20
E.Note.NoteEx noteEnter
Fin
Procdure Cration(var fn : FichEtud ) Var
Et : Etudiant rep : caractre
Dbut Ouvrir(fn,E) rep O Tant que MAJUS(rep) = O Faire
Ecrire("Identifiant : "),Lire(Et.Ident)
Ecrire("Nom : "),Lire(Et.Nom)
Ecrire("Prnom : "),Lire(Et.Prnom)
SaisiNotes(Et)
Ecrire(fn,Et)
Ecrire(Voulez*vous ajouter un autre nom (O/N) : ) Lire(rep)
Fin Tant que Fermer(fn)
Fin
Procdure CopierDansTab(fn :FichEtud; var n:Entier ;var T : TAB ) var
Et : Etudiant Moy : Rel
Dbut Ouvrir(fn,L) Lire(fn,Et) n 0 Tant que NON(FinDeFichier(fn)) Faire Moy 0.3 x Et.Note.noteCc + 0.7 x Et.Note.noteEx Si Moy 10 Alors n n + 1 T[n] Et Fin Si
Lire(fn,Et) Fin Tant que Fermer(fn)
Fin
-
Page 11 sur 53
Procdure TriBulle( n : Entier ; var T :TAB)
Var
i : Entier
aux : Etudiant
rep : Boolen
moy 1,moy2: Rel
Dbut
Rpter
rep faux
Pour i de 1 n Faire
moy1 0.3 x T[i].Note.noteCc + 0.7 x T[i]
moy2 0.3 x T[i+1].Note.noteCc + 0.7 x T[i+1]
Si moy1 < moy2 Alors
aux T[i]
T[i] T[i+1]
T[i+1] aux
rep vrai
Fin Si
Fin Pour
n n + 1
Jusqu rep = faux OU n =1
Fin
Procdure Rsultat(fn :FichEtud; var fr : FichEtud) Var i,n : Entier T : TAB Dbut
CopierDansTab(fn,n,T) TriBulle(n,T) Ouvrir(fr,E) Pour i de 1 n Faire
Ecrire(fr,T[i]) Fin Pour Fermer(fr)
Fin
Procdure Affichage(fr : FichNoms) var
Et : Etudiant Moy : Rel
Dbut Ouvrir(fr,L) Lire(fr,Et) Tant que NON(FinDeFichier(fr)) Faire
Moy 0.3 x Et.Note.noteCc + 0.7 x Et.Note.noteEx
Ecrire(Et.Ident, ,Et.Nom, ,Et.Prnom, ,Moy) Lire(fr,Et)
Fin Tant que Fermer(fr)
Fin
Dbut
Cration(Fn)
Affichage(Fn)
Rsultat(Fn,Fr)
Affichage(Fr)
Fin
-
Page 12 sur 53
+1,!-,!-
'*6
"7"!##"8+
9crire une fonction rcursive qui retourn la somme des chiffres dun entier N donn.
( 123 == > 1 + 2 + 3 = 6 )
"7"!##"8+1
9crire une fonction rcursive qui calcul la factorielle dun entier N positif.
( 5 ! = 5 x 4 x 3 x 2 x 1 = 120)
"7"!##"8+/
9crire une fonction rcursive qui permet de dterminer si un entier N saisi au clavier est
premier ou pas. (Un nombre premier nest divisible que par 1 ou luimme).
"7"!##"8+2
9crire une procdure rcursive qui permet dinverser une chaine de caractres sans utiliser
une chaine temporaire.
information noitamrofni
"7"!##"8+0
9crire une fonction rcursive qui permet de vrifier si deux chaines s1 et s2 sont
anagrammes ou non.
s1 et s2 sont anagrammes sils se composent de mme lettre.
s1 = "chien" ; s2 = "niche" vrai
"7"!##"8+A
9crire une fonction rcursive qui permet de vrifier si un mot planch en paramtre est
palindrome ou non.
mot = "aziza" vrai ; mot = "alga" faux
):;":*
(133?@)1
%
9crire une fonction rcursive nomme !$C qui permet de chercher un entier
x dans un tableau T de n entiers selon le principe de la recherche squentielle.
9crire une fonction rcursive nomme !$C qui permet de chercher un entier
x dans un tableau T de n entiers selon le principe de la recherche dichotomique.
"7"!##"8+=
9crire une procdure rcursive indirecte nomm C&qui permet de trier un tableau
T de n entiers. Utiliser les deux procdures cidessous :
,;Dd Alors
Rech_dico faux
Sinon
m (d + g) DIV 2
Si T[m] = x Alors
Rech_dico Vrai
Sinon Si T[m]>x Alors
Rech_dico Rech_dico(g,m;1,x,T)
Sinon
Rech_dico Rech_dico(m+1,d,x,T)
Fin Si
Fin Si
Fin
-
Page 17 sur 53
"7"!##"8+=
"7"!##"8+?
Procdure Permuter(var x, y : Entier)
Var
Aux : Entier
Dbut
aux x
x y
y aux
Fin
Procdure Parcours(i,n :Entier ; var rep : Boolen ; var T :TAB)
Dbut
Si iT[i+1] Alors
Permuter(T[i],T[i+1])
rep Vrai
Fin Si
Fin Si
Fin
Procdure TriBulle(n : Entier ;Perm : Boolen var T :TAB)
Var
Perm : Boolen
Dbut
!!'%
!!"
Si ((n>1) ET (Perm = vrai)) Alors
Perm Faux
Parcours(1,n,Perm,T)
TriBulle(n*1,Perm,T)
Fin Si
Fin
Procdure PermutCirc(var ch :chaine)
Dbut
!!
Si LONG(ch)>1 Alors
!!
Ch ch[LONG(ch)] + SOUS;CHAINE(ch,2,LONG(ch)*1)
Fin Si
Fin
-
Page 18 sur 53
F
!
"#
$"
%"
&&
'((
$
% ")*#.
# !
"#
$" "#
%"#$"
&& %"#
'(( &&
$ '((
%#")*#. $
+ ! %#")*#(,
"# +#!
$" "#
%"+$"
&&%"+
'((&&
$'((
%+")*#&$
-/%+")*#&
/,-+
0,
Procdure Anagramme(s : chaine ; c : Entier ; var l : Entier) Var i : Entier
tete, queue : chaine Dbut
Pour i de 1 LONG(s) * c tete SOUS;CHAINE(s, 1, c) queue SOUS;CHAINE(s, c+1, LONG(s)*c)
s = tete + PermutCirc(queue) Si c = LONG(s) * 1 Alors
l l + 1 Ecrire(l,")",s)
Sinon Anagramme(s, c + 1, l)
Fin Si Fin Pour
Fin
-+(%
+-+(%
(&++#11//,
-+(%
+-+(%
(&++#1120,
-
Page 19 sur 53
"7"!##"8+3 .
Algorithme Pyramide
Var
n : Entier !!
Fonction Saisie() : Entier
Var
m : Entier
Dbut
Ecrire("Entrer un nombre impair :")
Lire(m)
Si m MOD 2=0 Alors
SaisieSaisie()
Sinon
Saisie m
Fin Si
Fin
Procdure Espace(i :Entier)
Dbut
Si i>=1 Alors
Ecrire(" ")
Etoile(i*1) !!
Fin Si
Fin
Procdure Etoile(j :Entier)
Dbut
Si j>=1 Alors
Ecrire("")
Etoile(j*1) !!
Fin Si
Fin
Procdure Dessiner(k , m :Entier)
Dbut
Si k
-
Page 20 sur 53
+/,$-,$-
'*6< (
(
)
G(")'8)"#'(!) ! *+,
"! *
,
"7"!##"8+,! "(#'(!)-
- Dfinir une liste simple chaine compos dune valeur entire et dun pointeur vers
llment suivant ;
1- Dclarer une variable de ce type dfini dans la question 1) ;
/- crire une procdure permettant de crer une liste chaine de n entiers. #,
On dispose de deux listes L1 et L2 tris qui sont tris dans lordre croissant. crire une
procdure qui permet de fusionner deux listes L1 et L2 dans la liste L1.
"7"!##"8+A
crire une procdure qui permet de supprimer les doublons dans une liste chaine trie
dans lordre croissant qui contient des caractres alphabtiques. Comment peuton liminer
les doublons si la liste ntait pas trie ?
"7"!##"8+4
crire une fonction qui permet de vrifier si une liste est palindrome ou non.
"<
H H A
Cette liste est palindrome
' 7 H O
Cette liste nest pas palindrome
"7"!##"8+=
Une liste doublement chane est une liste qui admet, en plus de permettre l'accs au
suivant d'un lment, permet l'accs au prcdent d'un lment.
Quel est l'intrt de ce type de liste par rapport aux listes simplement chanes ?
crivez les fonctions et procdures suivantes en mettant ventuellement jour les
primitives prcdentes : . ,
-
Page 22 sur 53
Type
Liste : ^cellule
Cellule : Enregistrement
val : Entier
suiv : Liste
Fin Cellule
Var
L : Liste
Procdure CrerListe(n : Entier ; var L : Liste)
Var
Tete, p : Liste
i : Entier
Dbut
Allouer(Tete)
Ecrire("Entrer lment Tte :")
Lire(Tete^.val)
Tete^.suiv nil
L Tete
Pour i de 2 n faire
Allouer(p)
Ecrire("Entrer lment n :",i)
Lire(p^.val)
p^.suiv nil
L^.suiv p
L p
Fin Pour
L Tete #
Fin
#+/
G(")'8)"#'(!) ! *+,
$-.
/
"! *
,
$- 0
(
(
"7"!##"8+,! "(#'(!)- -
1-
/-
-
Page 23 sur 53
Procdure AffichageIter(L : Liste)
Var
p : Liste
Dbut
p L
Tant que p nil Faire
Ecrire(p^.val)
p p^.suiv
Fin Tant que
Fin
Procdure AffichageRecu(L : Liste)
Dbut
Si L nil Alors
Ecrire(p^.val)
AffichageRecu(p^.suiv)
Fin Si
Fin
%
Fonction Recherche(x : Entier ; L : Liste) : Boolen
Var
p : Liste
Dbut
p L
Tant que ((p nil) ET (p^.val x)) Faire
p p^.suiv
Fin Tant que
Si p = nil Alors
Recherche Faux
Sinon
Recherche Vrai
Fin Si
Fin
%
Fonction Recherche(x : Entier ; L : Liste) : Boolen
Dbut
Si L = nil Alors
Recherche Faux
Sinon
Si L^.val = x Alors
Recherche Vrai
Sinon
Recherche Recherche(x, L^.suiv)
Fin Si
Fin Si
Fin
2-
0-
-
Page 24 sur 53
Procdure AjouterTete(x : Entier ; var L : Liste)
Var
Tete : Liste
Dbut
Allouer(Tete)
Tete^.val x
Tete^.suiv L
LTete
Fin
%
Procdure Supprimer(x : Entier ; var L : Liste)
Var
P,Q : Liste
Dbut
Si L = nil Alors
Ecrire("Liste vide, impossible de supprimer ",x)
Sinon
SiL^.val = x Alors
P L &
L L^.suiv
Sinon
P L^.suiv
Tant que ((P nil) ET (P^.val x)) Faire
Q P
P P^.suiv
Fin Tant que
Si P nil Alors
Q^.suiv P^.suiv
Librer(P)
Fin Si
Fin Si
Fin Si
Fin
%
Procdure Supprimer(x : Entier ; var L : Liste)
Var
P : Liste
Dbut Si L nilAlors
Si L^.val = x Alors P L L L^.suiv Librer(P)
Sinon Supprimer(x, L^.Suiv)
FinSi FinSi
Fin
A-
4-
-
Page 25 sur 53
Procdure Inverse (var L : Liste)
Var
P,Q : Liste
Dbut
P nil
Tant que L nil Faire
Q L^.suiv
L^.suiv P
P L
L Q
Fin Tant que
Fin
Procdure TriBulle(var L : Liste)
Var
P, Q : Liste
Temp : Entier
Dbut
P L
Q L^.suiv
Rpter
rep faux
P L
Q L^.suiv '
Tant que Q nil Faire
Si P^.val>Q^.val Alors
Temp P^.val
P^.val Q^.val
Q^.val Temp
rep vrai
Fin Si
Fin tant que
Jusqu rep = faux
Fin
"7"!##"8+1
FFJ
0 4 ? 3 1
"7"!##"8+/
0 4 0 ? 4 0 3 ? 4 0 1 3 ? 4 15
-
Page 26 sur 53
Procdure Concatener(L1,L2 : Liste ; var L3 : Liste)
Dbut
Si L1 = nil ET L2 = nil Alors
L3 nil
Sinon Si L1 nil ET L2 = nil Alors
L3 L1
Sinon Si L1 = nil ET L2 nil Alors
L3 L2
Sinon
'(
L3 L1
()
Tant que L3^.suiv nil Faire
L3 L3^.suiv
Fin Tant que
("&()
L3^.suiv L2
#
L3 L1
Fin Si
Fin
Procdure Fusion(var L1 :Liste ; L2 : Liste)
Var
Tete, P, Q : Liste
Dbut
Si L1 = nil Alors *(
L1 L2
Sinon
Si L2 nilAlors
+# Si L1^.val L2^.val Alors
Tete L1
Sinon
Tete L2
Fin Si
Q Tete
Tant que L1 nil ET L2 nil Faire
Si L1^.val > L2^.val Alors
P L2
L2 L2^.suiv
Q^.suiv P
P^.suiv L1
Q P
"7"!##"8+2
"7"!##"8+0
-
Page 27 sur 53
Sinon Si L1^.val > L2^.val Alors
P L2
L2L2^.suiv
Q L1
L1L1^.suiv
Q^.suiv P
P^.suiv L1
Sinon
Q L1
L1 L1^.suiv
Fin Si
Fin Tant que
L1 Tete (
Fin Si
Fin Si
Fin
Procdure SupprimeDoublons(var L :Liste)
Var
Q , P : Liste
Dbut
Q L
Si L nilAlors
Tant que Q^.suiv nilFaire
P Q
Q Q^.suiv
Si Q^.val = P^.valAlors
(,-.
Q^.suiv P^.suiv
Librer(P)
Fin Si
Fin Tant que
Fin Si
Fin
Procdure SupprimeDoublons(var L :Liste)
Var
Q : Liste
Vpred : caractre
Dbut
Q L
Si L nilAlors
Tant que Q^.suiv nilFaire
VpredQ^.val
Q Q^.suiv
Si Q^.val = Vpred Alors
Supprimer(Vpred,Q)
Fin Si
Fin Tant que
Fin Si
Fin
"7"!##"8+A
Cette procdure se charge de
parcourir la liste G en supprimant toutes les valeurs
de I
Liste
trie
Liste
non
trie
-
Page 28 sur 53
Type
Liste : ^cellule
Cellule : Enregistrement
pred : Liste
val : Entier
suiv : Liste
Fin Cellule
Var
L : Liste
"7"!##"8+4
"7"!##"8+= Lintrt dune liste doublement chaine par rapport une liste chaine simple
cest pour acclrer la recherche dun lment.
E1
E2 E3
Fonction Palindrome(L : Liste) :Boolen
Var
Stop : Boolen
Deb, Fin, Q : Liste
Dbut
Deb L
Finnil
Stop faux *
Tant que Deb^.suiv FinETNON(Stop) Faire
$
QP
Tant que Q^.suiv FinFaire
Q Q^.suiv
Fin Tant que
Si P^.val = Q^.val Alors
Fin Q (
Sinon
Stop vrai #
Fin Si
Si Deb Fin Alors
Deb Deb ^.suiv
Fin Si
Fin Tant que
Palindrome NON(Stop)
Fin
Tte
Queue
-
Page 29 sur 53
Fonction Premier(L : Liste) : Liste
Dbut
Si L nullAlors
Premier L
Sinon
Premiernil
Fin Si
Fin
*/"0
Fonction Dernier(L : Liste) : Liste
Var
P : Liste
Dbut
P L
Tant que P^.suiv nullFaire
P P^.suiv
Fin Tant que
DernierP
Fin
Fonction estVide(L : Liste) : Boolen
Dbut
Si L = nilAlors
estVide vrai
Sinon
estVide faux
Fin Si
Fin
Procdure supprimerPremier(var L : Liste)
Var
P : Liste
Dbut
Si L nilAlors
P L
L L^.suiv
L^.prednil
Librer(P)
Fin Si
Fin
-
1-
/-
2-
*/ 0
Fonction Dernier(Queue : Liste) : Liste
Dbut
Dernier Queue
Fin
-
Page 30 sur 53
Procdure ajouterAprs(P,Q : Liste ; var L : Liste)
Var
D :Liste
Dbut
D L
Tant queD Q ETD nilFaire
D D^.suiv
Fin Tant que
Si D = Q Alors
D D^.suiv
D^.pred p
P^.suiv D
Q^.suiv P
P^.pred Q
Sinon
Ecrire("Ajout impossible, lment non existant") Fin Si
Fin
Procdure Supprimer(x : Entier ; var L : Liste)
Var
P,Q,D : Liste
Dbut
Si L = nil Alors
Ecrire("Liste vide, impossible de supprimer ",x)
Sinon
Si L^.val = x Alors
P L
L L^.suiv
Sinon
P L^.suiv
Tant que ((P nil) ET (P^.val x)) Faire
Q P
P P^.suiv
Fin Tant que
Si P nil Alors
D P^.suiv
D^.pred Q
Q^.suiv D
Librer(P)
Fin Si
Fin Si
Fin Si
Fin
0-
A-
-
Page 31 sur 53
"7"!##"8+?
.
"
$01&2
0
#01#.
E1
E2
E3
Tte
Procdure AjouterTte(e : Entier ; var L : Liste)
Var
N,Tete,Queue: Liste
Dbut
Allouer(N)
N^.val e
Si L = nilAlors
L N
N^.suiv L
L^.suiv N
Sinon
Tete L
Queue L
Tant que Queue^.suiv TeteFaire
Queue Queue^.suiv
Fin Tant que
Queue^.suiv N
N^.suivTete
Tete N
LTete
Fin Si
Fin
-
Page 32 sur 53
Procdure affiche(L : Liste)
Var
P :Liste
Dbut
Si L = nil Alors
Ecrire("Liste vide")
Sinon
P L!!1"
!!1*1"
Tant que P^.suiv P Faire
Ecrire(P^.val)
P P^.suiv
Fin Tant que
Fin Si
Fin
-
Page 33 sur 53
+2,-,-
'*6
)
"7"!##"8+,") ")- !
"!
)! )
3! 245!
6! 2%5!7
8! 2 5 9 ! 3
:! 2;59!
"7"!##"8+1,")")- ! *+/
"!
)! )
3! 24+5++!
6! 2+%5++!
8! 2 5 9 + +! 3
:! 2;59++!
):;":*
(133?@)1
%
3
" 7 8(
9
-(4+
"!
)!
3!
6!
8!
:!
Type
Pile : ^cellule
cellule : Enregistrement
val : Entier
suiv : Pile
Fin cellule
Var
P : Pile
Procdure InitialiserPile(var P : Pile)
Dbut
P nil
Fin
Fonction EstPileVide(P : Pile) : Boolen
Dbut
Si P = nil Alors
EstPileVide vrai
Sinon
EstPileVide faux
Fin Si
Fin
Procdure Empiler(x : Entier ; var P : Pile)
Var
Nv : Pile
Dbut
Allouer(Nv)
Nv^.val x
Nv^.suiv P
P Nv
Fin
Procdure Dpiler(var x : Entier ; var P : Pile)
Var
S : Pile
Dbut
Si NON(EstPileVide(P)) Alors
S P
x P^.val
P P^.suiv
Librer(S)
Fin Si
Fin
-
Page 35 sur 53
"7"!##"8+1,")")- ! . 4 56
-
73
7
7 8(
9
-+4+
"!
)!
3!
6!
8!
Type
Liste : ^cellule
cellule : Enregistrement
val : Entier
suiv : Liste
Fin cellule
File : Enregistrement
Tte : Liste
Queue : Liste
Fin File
Var
F : File
Procdure InitialiserFile(var F : File)
Dbut
F.Tte nil
F.Queue nil
Fin
Fonction EstFileVide(F : File) : Boolen
Dbut
Si F.Tte = nil Alors
EstPileVide vrai
Sinon
EstPileVide faux
Fin Si
Fin
Fonction Enfiler(x : Entier ; var F : File)
var
Nv : Liste
Dbut
Allouer(Nv)
Nv^.val x
Nv^.suiv nil
Si F.Queue nil Alors
F.Queue^.suiv Nv
Sinon
F.Tte Nv
Fin Si
F.Queue Nv
Fin
-
Page 36 sur 53
:!
Procdure Dfiler(var B : Arbre ; var F : File)
var
P : Liste
Dbut
Si F.Tte nil Alors
P F.Tte
B P^.val
F.Tte F.Tte^.suiv
Librer(P)
Fin Si
Si F.Tte = nil Alors
F.Queue nil
Fin Si
Fin
-
Page 37 sur 53
+0,**$$-,**$$-
'*6 )(
,
1
-(
"7"!##"8+,! "-
- ),
1- (
:
/- )
&6:
2- 2232?2)2 2"@2)@2"626@
A- 2 %57=!7
4- 2A+57=!7
=- 2$597=!7
?- 2
3-2 *
5 9 7 =!
"7"!##"8+1,")%")(!")-
- 2
1- 2
/- 2;46
2- 2;
0- 2
):;":*
(133?@)1
%
- *+,
! : Un * *B est un ensemble de nuds qui est soit vide, soitcompos dune racine et de deux arbres binaires disjoints J* et J*$.
Un Lest un sommet qui a au moins un fils (gauche ou droit ou les deux). Une est un sommet qui n'a pas de fils. La $Mx est la longueur (en nombre d'arcs) du plus long chemin de
x une feuille. La $M*est gale la hauteur de la racine.
1-
/-
2-
Type
Arbre : ^Nud
Nud : Enregistrement
Val : Entier
FilsG : Arbre
FilsD : Arbre
Fin Nud
Var
A : Arbre
Procdure CrerElement(x : Entier ; var B : Arbre)
Dbut
Si B = nilAlors
Allouer(B)
B^.val x
B^.FilsGnil
B^.FilsDnil
Sinon
Si B^.val> x Alors
CrerElement(x, B^.FilsG)
Fin Si
Si B^.val< x Alors
CrerElement(x, B^.FilsD)
Fin Si
Fin Si
Fin
F
N
F F F
N
!F*
F*
8LF*
Largeur de larbre
Ha
ute
ur d
e la
rbre
-
Page 41 sur 53
0-
-
1-
/-
2- . La premire stratgie de parcours dun arbre binaire de recherche est dite en
profondeur dabord ou dans lordre prfix.
Fonction EstVide(B :Arbre) : Boolen
Dbut
Si B = nilAlors
EstVide faux
Sinon
EstVide vrai
Fin Si
Fin
Fonction Recherche(x : Entier ; B : Arbre) : Boolen
Dbut
Si B=nil Alors
Recherche faux
Sinon
Si B^.val = x Alors
Recherche vrai
Sinon Si B^.val> x Alors
Recherche Recherche(x, B^.FilsG)
Sinon
Recherche Recherche(x, B^.FilsD)
Fin Si
Fin Si
Fin
Fonction EstUnFeuille(B :Arbre) : Boolen
Dbut
Si B^.FilsG = nil ET B^.FilsD = nil Alors
EstUnFeuille vrai
Sinon
EstUnFeuille faux
Fin Si
Fin
-
Page 42 sur 53
-15 10 5 12 30 20 37
1. La deuxime stratgie de parcours dun arbre binaire de recherche est dite : parcours de larbre dans lordre ou symtrique . Le parcours donne des valeurs tries dans lordre croissant.
-5 10 12 15 20 30 37
/. La troisime stratgie de parcours dun arbre binaire de recherche est dite : parcours de larbre dans lordre .
Procdure ParcoursPrfixe(B : Arbre)
Dbut
Si B nilAlors
Ecrire(B^.val)
ParcoursPrfixe(B^.FilsG)
ParcoursPrfixe(B^.FilsD)
Fin Si
Fin
1
/
2
0
A
Procdure ParcoursInfix(B : Arbre)
Dbut
Si B nilAlors
ParcoursInfix(B^.FilsG)
Ecrire(B^.val)
ParcoursInfix(B^.FilsD)
Fin Si
Fin
/ 0 3
45
6
-
Page 43 sur 53
- 5 10 12 20 37 30 15
0- Le principe de suppression doit obir aux constations suivantes :
La suppression commence par la recherche de l'lment. Une fois trouv ce dernier :
si c'est une feuille, on la vire sans problmes
si c'est un sommet qui n'a qu'un fils, on le remplace par ce fils
si c'est un sommet qui a deux fils, on a deux solutions :
. le remplacer par le sommet de plus grande valeur dans le sous arbre gauche.
1. le remplacer par le sommet de plus petite valeur dans le sous arbre droit. Pour simplifier le travail nous allons commencer par crire deux fonctions : la premire
renvoie llment qui a la plus grande valeur dans le sous arbre gauche ; la deuxime
renvoie llment qui a la plus petite valeur dans le sous arbre droit.
/
0
6
4
5
3
Procdure ParcoursPostfix(B : Arbre)
Dbut
Si B nilAlors
ParcoursPostfix(B^.FilsG)
ParcoursPostfix(B^.FilsD)
Ecrire(B^.val)
Fin Si
Fin
Fonction PlusPetitSousArbreDroit(B : Arbre)
Dbut
Si B^.FilsG nil Alors
PlusPetitSousArbreDroit PlusPetitSousArbreDroit(B^.FilsG)
Sinon
PlusPetitSousArbreDroit B
Fin Si
Fin
Fonction PlusGrandSousArbreGauche(B : Arbre)
Dbut
Si B^.FilsD nil Alors
PlusGrandSousArbreGauche PlusGrandSousArbreGauche(B^.FilsD)
Sinon
PlusGrandSousArbreGauche B
Fin Si
Fin
-
Page 44 sur 53
"7"!##"8+1,")%")(!")-
-
Procdure Supprimer(x : Entier ; var B : Arbre)
Var
P, Q : Arbre
Dbut
Si B = nil Alors
Ecrire ("Arbre vide ", x, " est introuvable")
Sinon
Si B^.val = x Alors
Si B^.FilsG = nil ET B^.FilsD = nil Alors
// Si cest une feuille Librer(B)
Sinon Si B^.FilsG nil ET B^.FilsD = nil Alors
// Si le sommet admet un sous arbre gauche BB^.FilsG Sinon Si B^.FilsG = nil ET B^.FilsD nil Alors
// Si le sommet admet un sous arbre gauche BB^.FilsD Sinon Si B^.FilsG nil ET B^.FilsD nil Alors
// Si le sommet admet deux fils // On cherche le plus petit ou le plus grand P PlusPetitSousArbreDroit(B^.FilsD)
// ou aussi on peut chercher le plus grand >> P PlusGrandSousArbreGauche(B^.FilsG) Q P
Q^.FilsG B^.FilsG
Q^.FilsD B^.FilsD
Librer(P)
B Q Fin Si Sinon Si B^.val > x Alors
Supprimer(x, B^.FilsG)
Sinon
Supprimer(x, B^.FilsD)
Fin Si
Fin Si
Fin
Fonction Taille (B : Arbre) : Entier
Dbut
Si B = nil Alors
Taille 0
Sinon
Taille 1 + Taille(B^.FilsG) + Taille(B^.FilsD)
Fin Si
Fin
-
Page 45 sur 53
1-
/-
2-
Fonction Max(x,y :Entier) : Entier
Dbut
Si x>y Alors
Max x
Sinon
Max y
Fin Si
Fin
Fonction Hauteur(B : Arbre) : Entier
Dbut
Si B = nil Alors
Hauteur 0
Sinon
Hauteur 1 + Max(Hauteur(B^.FilsG),Hauteur(B^.FilsD))
Fin Si
Fin
Fonction NombreDeNoeudsExternes(B : Arbre) : Entier
Dbut
Si B = nil Alors
NombreDeNoeudsExternes 0
Sinon
Si EstUneFeuille(B) Alors
NombreDeNoeudsExternes 1
Sinon
NombreDeNoeudsExternes
NombreDeNoeudsExternes(B^.FilsG) +
NombreDeNoeudsExternes(B^.FilsD)
Fin Si
Fin Si
Fin
Fonction NombreDeNoeudsInternes(B : Arbre) : Entier
Dbut
Si B = nil Alors
NombreDeNoeudsInternes 0
Sinon
Si EstUneFeuille(B) Alors
NombreDeNoeudsInternes 0
Sinon
NombreDeNoeudsInternes 1 +
NombreDeNoeudsInternes(B^.FilsG) +
NombreDeNoeudsInternes(B^.FilsD)
Fin Si
Fin Si
Fin
-
Page 46 sur 53
0-
"7"!##"8+/, !#'(!)"8!"(!-
=
-
Spcification : on additionne les profondeurs des feuilles de