Académique Documents
Professionnel Documents
Culture Documents
Algorithme et Structures
des Données 2
Support de cours
Farah HARRATHI
Maître Assistant en Informatique
E-mail : harrathi.farah@gmail.com
Objectifs du cours :
-i-
-ii-
Table des matières
1. Préface ................................................................................................................................... i
2. Table des matières............................................................................................................ 3
3. Table des figures ............................................................................................................... 5
4. Chapitre 1 : Les listes chaînées ..................................................................................... 6
1.1 Introduction ............................................................................................................................. 6
1.2 Notion de maillon ................................................................................................................... 6
1.3 Notion de liste chaînée ......................................................................................................... 6
1.4 Implémentation du type liste chaînée............................................................................ 7
1.4.1 Déclaration d’une variable de type liste........................................................................... 7
1.4.2 Accès aux champs d’un maillon d’une liste ..................................................................... 7
1.4.3 Initialisation d’une liste à Nil ................................................................................................ 8
1.5 Insertion d’une valeur en tête d’une liste ..................................................................... 8
1.6 Récupérer l’adresse du dernier élément d’une liste ................................................. 9
1.7 Insertion d’une valeur en queue d’une liste ............................................................. 10
1.8 Longueur d’une liste .......................................................................................................... 11
1.9 Insertion d’une valeur à une position k dans une liste ......................................... 11
1.10 Suppression du premier maillon d’une liste ........................................................... 13
1.11 Suppression du dernier maillon d’une liste ............................................................ 15
1.12 Suppression de tous les maillons d’une liste .......................................................... 16
1.13 Les listes circulaires.......................................................................................................... 16
5. Chapitre 2 : Les listes doublement chaînées ........................................................ 18
1.14 Les listes doublement chaînées.................................................................................... 18
1.14.1 Le type liste doublement chaînée ................................................................................... 18
1.14.2 Insertion d'un maillon (une valeur) en tête d’une liste doublement
chainée ........................................................................................................................................ 19
1.15 Insertion d’une valeur en queue d’une liste doublement chainée .................. 20
1.16 Insertion d’une valeur v à une position k dans une liste doublement
chainée ............................................................................................................................................. 22
1.17 Suppression du premier maillon d’une liste doublement chainée ................. 24
2.11 Suppression du dernier maillon d’une liste doublement chainée .................. 25
6. Chapitre 3 : Les piles ..................................................................................................... 27
3.11 Définition et exemple ....................................................................................................... 27
-iii-
3.12 Opérations sur les piles .................................................................................................. 27
3.13 Implantation d’une pile par liste chaînée ................................................................. 28
3.14 Les opérations sur unepile ............................................................................................. 28
7. Chapitre 4 : Les files ...................................................................................................... 30
4.1 Définition ................................................................................................................................ 30
4.2 Les opérations sur une file .............................................................................................. 30
4.3 Implantation d’une file par liste chaînée ................................................................... 31
4.4 Les opérations sur une file .............................................................................................. 32
8. Chapitre 5 : Les arbres.................................................................................................. 33
5.1 Introduction .......................................................................................................................... 33
5.2 Terminologie de base et définitions ............................................................................ 34
5.3 Parcours d’arbres ................................................................................................................ 34
9. Chapitre 6 : Les arbres binaires ................................................................................ 36
6.1 Définition ................................................................................................................................ 36
6.2 Implémentation du type arbre binaire ....................................................................... 37
6.2.1 Déclaration d’une variable de type arbre ..................................................................... 37
6.2.2 Accès aux champs d’un nœud d’un arbre binaire ..................................................... 38
6.3 Insertion d’un nœud d’une valeur v dans un arbre binaire ................................ 38
6.4 Parcours d’un arbre binaire ............................................................................................ 38
6.4.1 Parcours Prefixe ...................................................................................................................... 38
6.4.2 Parcours Infixe......................................................................................................................... 39
6.4.3 Parcours Postfixé .................................................................................................................... 39
6.5 Tester si un Nœud est une feuille ................................................................................. 39
6.6 Nombre de feuilles dans un arbre binaire ................................................................. 39
10. Chapitre 7 : Les arbres binaires de recherche ..................................................... 40
7.1 Définition ................................................................................................................................ 40
7.2 Ajout d’une valeur dans un ABR .................................................................................... 40
7.3 Recherche d’une valeur dans un ABR ......................................................................... 42
7.4 Recherche du nœud père d’une valeur dans un ABR ............................................ 43
7.5 Recherche du max d’un ABR ........................................................................................... 44
7.6 Suppression d’une valeur dans un ABR ...................................................................... 44
11. Webographie ................................................................................................................... 49
-iv-
Table des figures
-v-
Chapitre 1 : Les listes chaînées
1.1 Introduction
Une liste chaînée permet de stocker un ensemble de valeur du même type, comme
un tableau. Contrairement au tableau, la taille de la liste chaînée peut varier au cours
du temps pas comme pour les tableaux où la taille est fixe. En effet, la liste n'est pas
allouée en une seule fois, mais les maillons sont alloués d'une manière
incrémentale.
L'élément de base d'une liste chaînée s'appelle le maillon. Il est constitué : d’un
champ de données et d'un champ pointeur vers un maillon.
Données
Pointeur
Dans une liste chaînée, chaque élément pointe, à l'aide d’un pointeur (suivant)
vers l'élément suivant dans la liste ; le dernier élément, par définition, n'a pas de
suivant, donc son pointeur suivant vaut nil.
-6-
p
Pour manipuler une liste chaînée, nous manipulons un pointeur sur le premier
élément ; comme chaque élément « connaît » l'élément suivant, on peut ainsi accéder
à tous les éléments de la liste. Notons enfin que si le pointeur p vaut nil, cela signifie
que la liste est vide (elle ne contient aucun élément).
Le premier maillon de la liste est appelé tête, le dernier maillon de la liste est
appelé queue.
Une fois le type liste est défini, on peut déclarer une variable de type pointeur sur
liste de la manière suivante :
p : ^liste
Si p est un pointeur sur une variable de type liste, p^ est la variable (ou l'objet)
pointée par p. cette variable est un enregistrement, pour accéder à ses champs on
utilise l’opérateur "." .
p^. valeur
p^. suivant
-7-
1.4.3 Initialisation d’une liste à Nil
Ecrire la procédure InserTete qui permet d’insérer une valeur val en tête d’une
liste chaînée donnée par l’adresse de son premier élément (p).
Notons qu’après l’insertion la valeur du premier sera changée, donc le passage
doit se faire par adresse.
p
val
Principe
-8-
Algorithme
Ecrire la procédure Dernier qui renvoie l’adresse du dernier élément d’une liste
donnée par l’adresse de son premier élément (p).
Der
Principe
Le dernier élément de la liste s’il existe est un maillon qui ne possède pas de
suivant. On fait le parcours de la liste, du premier élément jusqu’à trouver un maillon
dont le suivant vaut nil. L’adresse de ce maillon est renvoyée par la fonction Dernier
définie comme suit :
Algorithme
-9-
1.7 Insertion d’une valeur en queue d’une liste
Ecrire la procédure InsertQueue qui permet d’insérer une valeur val dans une
liste chaînée donnée par l’adresse de son premier élément (p).
Notons qu’après l’insertion d’un maillon en queue, la valeur du premier peut
changer (dans le cas où la liste est vide), donc le passage doit se faire par adresse.
p
val
Der
Principe
Deux cas :
1. Si la liste est vide l’insertion en queue est une insertion en tête.
Si (p =Nil) alors
InsertTete (p, val)
2. Sinon
créer un maillon d’adresse p1 contenant la valeur v et dont l’élément
suivant est Nil
sinon
p1nouveau(^liste)
p1^.valeurval
p1^.suivantNil
Récupérer l’adresse du dernier maillon et l’affecter à un pointer Der,
ensuite p1 devient le suivant de Der
Der dernier(p)
Der^.suivantp1
Finsi
-10-
Algorithme
Principe
Ecrire la procédure Insertk qui permet d’insérer une valeur val à une position k
dans une liste chaînée donnée par l’adresse de son premier élément (p). La valeur
val aura le rang k dans la liste après l’insertion.
-11-
Notons qu’après l’insertion la valeur de p peut changer (dans le cas où k=0) donc
le passage doit se faire par adresse.
p
val
Pk-1
=2 pk
Principe
Sinon
- Récupérer l’adresse du maillon qui se trouve à la position k-1 (p2)
.
sinon
pour i de 1 a k-1 faire
p2p2^.suivant;
finpour
-12-
- créer un maillon d’adresse p1 contenant la valeur val et dont
l’élément suivant est Nil
p1nouveau (^liste)
p1^.valeurval
- Le suivant de p1 est le suivant de p2.
P1^.suivant p2^.suivant
- Le suivant de p2 est p1.
p2^.suivant p1
Finsi
Finsi
Algorithme
-13-
p
Principe
Algorithme
-14-
1.11 Suppression du dernier maillon d’une liste
AvDer P2
Principe
-15-
AvDer ^.suivantNil
on libère la zone mémoire d’adresse p2.
Liberer (p2)
finsi
Algorithme
Ecrire la procédure SuppListe qui permet de supprimer tous les éléments d’une
liste chaînée donnée par l’adresse de son premier élément (p).
Notons qu’après la suppression, la valeur du premier vaut nil, donc le passage
doit se faire par adresse.
Algorithme
Une liste où le pointeur nil du dernier élément est remplacé par l’adresse du
premier élément est appelée liste circulaire.
-16-
Théoriquement, dans une liste circulaire tous les maillons sont accessibles à
partir de n’importe quel autre maillon. Une liste circulaire n’a pas de premier et de
dernier maillon.
Par convention, on peut prendre le pointeur externe de la liste vers le dernier
élément et le suivant serait le premier élément de la liste.
-17-
Chapitre 2 : Les listes doublement chaînées
Dans une liste doublement chaînée un maillon est composé de trois champs :
un champ de données ;
un pointeur vers le maillon suivant.
un pointeur vers le maillon précédent.
Données
Précédent Suivant
-18-
p
Ecrire la procédure InserTete2 qui permet d’insérer une valeur v en tête d’une
liste doublement chaînée donnée par l’adresse de son premier élément (p).
Notons qu’après l’insertion la valeur du pointeur p sera changée donc le passage
doit se faire par adresse.
p
nil
p
nil
Principe
Algorithme
Ecrire la procédure InsertQueue2 qui permet d’insérer une valeur val dans une
liste doublement chaînée donnée par l’adresse de son premier élément (p).
Notons qu’après l’insertion d’un maillon en queue, la valeur du premier peut
changer (dans le cas où la liste est vide), donc le passage doit se faire par adresse.
-20-
p
Figure 2.5-La liste avant l’insertion de la valeur val en queue d’une liste doublement chainée
Figure 0.6-La liste aprés l’insertion de la valeur val en queue d’une liste doublement chainée
Principe
Deux cas :
3. Si la liste est vide l’insertion en queue est une insertion en tête.
Si (p =Nil) alors
InsertTete2 (p, val)
4. Sinon
créer un maillon d’adresse p1 contenant la valeur v et dont l’élément
suivant est Nil
sinon
p1nouveau(^liste)
p1^.valeurval
p1^.suivantNil
Récupérer l’adresse du dernier maillon et l’affecter à un pointer Der,
ensuite p1 devient le suivant de Der
Der dernier(p)
Der^.suivantp1
P1^.precedent der
Finsi
Algorithme
-21-
p1 nouveau(^liste)
p1^.valeurval
p1^.suivantNil// il sera le dernier
Der dernier(p)
Der^.suivantp1
P1^.precedent der
Finsi
Fin
Ecrire la procédure Insertk qui permet d’insérer une valeur val à une position k
dans une liste chaînée doublement chainée donnée par l’adresse de son premier
élément (p). La valeur val aura le rang k dans la liste après l’insertion.
Notons qu’après l’insertion la valeur de p peut changer (dans le cas où k=0) donc
le passage doit se faire par adresse.
p
nil
p
nil
Figure 02.7-insertion une valeur à la 2ème position dans une liste doublement chaînée
Principe
Sinon
-22-
- Récupérer l’adresse du maillon qui se trouve à la position k-1 (p2)
.
sinon
pour i de 1 a k-1 faire
p2p2^.suivant;
finpour
Algorithme
Finsi
Finsi
Fin
nil
P2
p
p nil
Principe
Principe
Algorithme
p
nil
Der
Figure 2.10-Une liste doublement chaînée p avant suppression du dernier maillon queue
p
nil nil
-26-
Chapitre 3 : Les piles
Une pile est une liste ordonnée sans fin d’éléments dans laquelle on ne peut
introduire ou enlever un élément qu'à une extrémité appelée tête de pile ou
sommet de pile.
Dans une pile, le dernier élément inséré sera le premier à être supprimé,
(retiré) : on parle de liste LIFO (Last In First Out).
-27-
Théoriquement, Il n’y a aucune limite au nombre d’éléments qu’on peut empiler.
Par contre, on ne peut dépiler d’une pile vide. A cet effet, on a une fonction
PileVide(p) qui retourne Vrai si la pile est vide sinon Faux.
InitialiserPile(p) ou ViderPile(p)
On peut vouloir aussi connaître le sommet de pile (la valeur de l’objet au
sommet) sans le supprimer (dépiler).
e SommetDePile(p)
L’implantation d’une pile par une liste (simplement) chaînée est une version
simplifiée de celle d’une liste par liste chaînée.
Type Pile=enregistrement (* un enregistrement dont le champ contient une liste chaînée *)
ListeElem : ^liste
finenregistrement
-29-
Chapitre 4 : Les files
4.1 Définition
Une file est une structure de données dynamique dans laquelle on insère des
nouveaux éléments à la fin (queue) et on enlève des éléments au début (tête de file)
(REBAINE, 1, 2009).
Exemples
Figure 3.1 : Une file respectant le principe FIFO [3] Figure 3.2 : Une file qui ne
respecte pas le principe
FIFO [4]
Par principe, dans une file, le premier élément inséré est aussi le premier retiré.
On parle de mode d’accès FIFO (Fisrt In Fist Out). Contrairement à la pile, la file est
modifiée à ses deux bouts.
-30-
Ainsi, la suite des opérations Enfiler (f, A), Enfiler (f, B) et Enfiler (f, C) donnent
la file suivante :
A B C
Tete Fin
Noter qu’en principe, il n’y aucune limite aux nombres d’éléments que l’on peut
ajouter dans une file.
L’opération e Defiler (f), retire (supprime) un élément de la fin de la file et
renvoie sa valeur dans e.
Ainsi l’opération e Defiler (f) provoque un changement d’état de la file et met
l’élément A dans e.
B C
Tete Fin
L'opération Defiler ne peut s’effectuer sur une file vide. Il faudra donc utiliser une
opération FileVide qui permet de tester si une file est vide ou pas.
Le résultat des opérations Enfiler (f, D) et Enfiler (f, E) est donné par la figure
précédente.
B C D E
Tete Fin
L’implantation d’une pile par une liste (simplement) chaînée est une version
simplifiée de celle d’une liste par liste chaînée.
Type File=enregistrement
ListeElem : ^liste
Finenregistrement
-31-
4.4 Les opérations sur une file
-32-
Chapitre 5 : Les arbres
5.1 Introduction
Un arbre est par définition une structure hiérarchique. La structure d’arbre très
utilisée dans tous les domaines, parce que bien adaptée à la représentation naturelle
d’informations homogènes organisées, et d’une grande commodité et rapidité de
manipulation (REBAINE, 2,2009).
Exemples :
-33-
5.2 Terminologie de base et définitions
Le parcours d’un arbre s’effectue dans un certain ordre pour visiter tous ses
nœuds. Les parcours les plus classiques sont les parcours infixé, préfixé et
postfixé. Ces parcours sont définis récursivement de la manière suivante :
1- Infixe (symétrique) : on parcourt d’abord le premier sous-arbre en
infixé, puis la racine, puis chacun des autres sous-arbres, en infixe.
2- Préfixe ou Pré-ordre : on parcourt d’abord la racine, puis chacun des
sous-arbres en préfixe.
3- Postfixe ou Post-ordre : on parcourt d’abord tous les sous-arbres en
postfixe, puis on parcourt la racine.
-34-
Figure 0.3 : Parcours d’un arbre
1- Infixe : L J E B F A C G D H K I
2- Préfixe : A B E J L F C D G H I K
3- Postfixe : L J E F B C G H K I D A
-35-
Chapitre 6 : Les arbres binaires
6.1 Définition
Les arbres binaires sont un cas particulier d’arbres. Ce sont des arbres où chaque
nœud possède au plus un fils gauche et au plus un fils droit. Si un nœud possède un
seul fils, il est soit un fils gauche ou un fils droit.
Exemple
Un arbre binaire localement complet est un arbre binaire dont chacun des nœuds
possèdent soit 0 soit 2 fils. Ceci veut donc dire que les nœuds internes auront tous
deux fils. Dans ce type d'arbre, on peut établir une relation entre la taille de l'arbre
et le nombre de feuille. En effet, un arbre binaire localement complet de taille n aura
n+1 feuille. L'arbre suivant est localement complet :
-36-
Figure 5.3 : Arbre dégénéré
Une fois le type arbre est défini on peut déclarer une variable de type pointeur
sur arbre de la manière suivante :
p : ^arbre
-37-
6.2.2 Accès aux champs d’un nœud d’un arbre binaire
Si p est un pointeur sur une variable de type arbre, p^ est la variable pointée par
p. cette variable est un enregistrement, pour accéder à ses champs on utilise
l’opérateur "." .
p^. valeur
p^. filsg
p^. filsd
Principe
Créer un nœud d’adresse n contenant la valeur v et dont le sous arbre gauche est
g et le sous arbre droit est d.
Algorithme
-38-
6.4.2 Parcours Infixe
-39-
Chapitre 7 : Les arbres binaires de recherche
7.1 Définition
Un Arbre Binaire de Recherche (ABR) A est dit de recherche ssi : si v est la valeur
portée par un nœud N de l’arbre A alors
1) v est supérieure a toutes les valeurs présentes dans le sous arbre gauche de N
2) v est inférieure a toutes les valeurs présentes dans le sous arbre droite de N
4 9
1 5
Ecrire la procédure Ajout qui permet d’ajouter une valeur v à un arbre binaire de
recherche donné par l’adresse de sa racine r.
-40-
7
4 9
1 5
4 9
1 5
Principe
-41-
Algorithme
Principe
-42-
Recherche Recherche (racine^.filsd, v)
finsi
finsi
finsi
Algorithme
Ecrire la fonction Pere qui permet de renvoyer l’adresse du nœud père du nœud
qui contient une valeur v dans un arbre binaire de recherche donné par l’adresse de
sa racine (racine).
Algorithme
Algorithme
Ecrire la PROCEDURE Supv qui permet de supprimer une valeur v dans un arbre
binaire de recherche donné par l’adresse de sa racine (r).
Principe :
-44-
7
4 9
1 5
4 9
1 5
-45-
7
4 9
1 5
1 5
-46-
7
4 9
1 5
Algorithme
-47-
si(estfeuille(f)) alors // 0 fils
si(p^.filsg et p^.filsg^.valeur=v) alors
p^.filsgNIL
Liberer(f)
sortir
sinon
p^.filsdNIL
Liberer(f)
sortir
finsi
finsi
fin
-48-
Webographie
[1] https://fanfanvaconsin.files.wordpress.com/2016/04/unknown-11.jpeg
[2] https://krohne.com/fr/industries/industrie-maritime/navires-porte-conteneurs-industrie-maritime/
[3] https://www.oujdacity.net/national-article-115966-fr/waiting-dull-and-boring.html
[4] http://www.indiansamourai.com/media/00/02/19889217.jpg
-49-