12/12/2022
Plan
1 Rappel sur les notions de base
1.1 Le traitement Séquentiel, Conditionnel, Itératif
I.2 Les structures de données Tableau, Enregistrement, Chaîne de Caractères
1.3 Les Procédures et Fonctions
2 La Récursivité
3 Les Structures de données dynamiques
3.1 La liste chaînée simple
3.2 La liste chaînée double
4 Les structures de données abstraites
4.1 La Pile
4.2 La File
4.3 Les Graphes
4.4 Les Arbres
47
GESTION DYNAMIQUE DE LA MÉMOIRE
Déclaration des variables statiques connaître
le nombre de données nécessaires au programme.
Tableaux : déclarer des tableaux d’une taille maximale
fixée
Nombre de données inconnu à priori ?
Solution : allouer dynamiquement et à la demande, des
emplacements en mémoire pour stocker les données.
48
1
12/12/2022
GESTION DYNAMIQUE DE LA MÉMOIRE
Type : Pointeur
^type_base
Exemple : X
X : ^entier
CH : ^chaine CH
E : ^etudiant
E
Constante : NIL
49
GESTION DYNAMIQUE DE LA MÉMOIRE
p : ^type_base
Opérations :
Réservation (allocation) :
Créer( p )
Libération :
Libérer( p )
50
2
12/12/2022
GESTION DYNAMIQUE DE LA MÉMOIRE
IMPORTANT:
Libérer les zones mémoires dont on n’a plus besoin
La mémoire libérée sera à nouveau disponible pour des
appels ultérieurs de Créer
Que se passe-t-il si on passe en argument à Libérer une
adresse non obtenue par Créer ?
51
LISTES CHAÎNÉES
Présentation:
Tableau : représenter en mémoire une collection de données de même nature.
Tableau : manipulé sous forme linéaire : la donnée à l’indice i + 1 est consécutive
en mémoire à la donnée d’indice i.
! Cette contiguïté peut ne pas être satisfaisante :
ajouter ou supprimer une donnée à un endroit quelconque
décaler la fin du tableau .
Problème :
La notion d’élément suivant dans un tableau est une notion implicite.
Solution:
Expliciter la notion du suivant : utiliser l’adresse mémoire afin de désigner de
façon unique un élément.
52
3
12/12/2022
LISTES CHAÎNÉES
Définition:
On appelle donc liste chaînée ou plus simplement liste une structure de
données constituée d’éléments contenant chacun :
une donnée;
une référence (adresse, ou pointeur) de l’élément suivant.
La liste est elle-même totalement déterminée par la référence (l’adresse) de
son premier élément.
Premier élément = tête de liste.
Le dernier élément de la liste n’a pas de successeur. Son successeur est la
constante NIL
53
LISTES CHAÎNÉES
Opérations sur les listes:
l’initialisation d’une liste (en général, liste vide) ;
le test, permettant de déterminer si une liste est vide ;
passage à l’élément suivant ;
l’ajout d’un élément dans une liste ;
la suppression d’un élément dans une liste ;
le parcours de la liste ; etc…
54
4
12/12/2022
LISTES CHAÎNÉES
LS1 = ^nœud
noeud = enreg
val : valeur
next : LS1
fenreg
Exemple : liste = ( 1 , 2 , 3 , 4) représentée par L
L
1 2 3 4 NIL
55
LISTES CHAÎNÉES –Insertion en tête
Insertion en tête: insérer x en tête de L
L ……. NIL
56
5
12/12/2022
LISTES CHAÎNÉES- Insertion en tête
insère_tête( var L : LS1 ; x : valeur)
var p : LS1
Début
créer( p )
p^.val := x
p^.next := L
L := p
Fin
57
LISTES CHAÎNÉES- Insertion en queue
Insertion en queue: insérer x à la fin de L
L:
……. NIL
X NIL
58
6
12/12/2022
LISTES CHAÎNÉES- Insertion en queue
insère_queue( var L : LS1 ; x : get_last( L : LS1 ) : LS1
valeur)
var p : LS1
var p , last : LS1
Début
Début
p := L
créer( p )
tant que p^.next ≠ NIL faire
p^.val := x
p := p^.next
p^.next := NIL
fait
Si ( L = NIL )
get_last := p
alors L := p
Fin
sinon
last := get_last( L )
last^.next := p
fsi
Fin
59
LISTES CHAÎNÉES- Insertion triée
Insertion après un élément: insérer x après y
L:
Y ……. NIL
60
7
12/12/2022
LISTES CHAÎNÉES- Insertion triée
insère_triée( var L : LS1 ;x :valeur) get_pred( L : LS1 ; x : valeur ) : LS1
var p , pred : LS1 var p , pred : LS1
Début Début
créer( p ) p := L
p^.val := x pred := NIL
Si ( L = NIL ) tant que p ≠ NIL et p^.val < x faire
alors p^.next := NIL pred := p
L := p p := p^.next
sinon fait
pred := get_pred(L , x) get_pred := pred
si pred = NIL Fin
alors p^.next := L
L := p
sinon p^.next := pred^.next
pred^.next := p
fsi
fsi
Fin
61
LISTES CHAÎNÉES- Suppression en tête
Pré-condition : La liste est NON VIDE
Suppression en tête : Supprimer la tête de L
NIL
…….
62
8
12/12/2022
LISTES CHAÎNÉES- Suppression en tête
Supprime_tête( var L : LS1 )
var p : LS1
Début
p := L
L := L^.next
Libérer( p )
Fin
63
LISTES CHAÎNÉES- Suppression en queue
Suppression en queue: Supprimer le dernier élément de L
NIL
NIL
Cas Particulier : Liste avec 1 seul élément
L NIL
L
NIL
64
9
12/12/2022
LISTES CHAÎNÉES- Suppression en queue
Supprime_queue( var L : LS1 ) get_pred_last( L : LS1 ) : LS1
var pred , last : LS1 var p , pred : LS1
Début Début
pred := get_pred_last( L ) p := L
Si ( pred = NIL ) pred := NIL
alors last := L tant que p^.next ≠ NIL
L := NIL faire
sinon pred := p
last := pred^.next p := p^.next
pred^.next := NIL fait
fsi get_pred_last := pred
Libérer( last ) Fin
Fin
65
LISTES CHAÎNÉES - Suppression d’un élément x
Suppression d’un élément x donné:
L
……. NIL
66
10
12/12/2022
LISTES CHAÎNÉES- Suppression d’un élément x
Supprime_val(var L :LS1; x : valeur ) get_pred_val( L : LS1 ; x : valeur ) : LS1
var pred , p : LS1 var p , pred : LS1
Début Début
pred := get_pred_val( L , x) p := L
Si ( pred = NIL ) % x 1er de L ou x ɇ L pred := NIL
alors Si (L^.val = x ) tant que p ≠ NIL et p^.val ≠ x faire
alors p := L pred := p
L := L^.next p := p^.next
sinon p := NIL fait
fsi si p == Nil ou p^.val <> x Alors // x ɇ L
sinon get_pred_val := Nil
p := pred^.next sinon
pred^.next := p^.next get_pred_val := pred
fsi fsi
Si ( p ≠ NIL ) Fin
alors Libérer( p )
fsi
Fin
67
LISTES CHAÎNÉES
LS2 = enreg
first : ^nœud
last : ^nœud
fenreg
noeud = enreg
val : valeur
next : ^nœud
fenreg
Exemple : liste = ( 1 , 2 , 3 , 4) représentée par L
L 1 2 3
4
68 NIL
11
12/12/2022
LISTES CHAÎNÉES – Liste chaînée double
Liste chaînée double:
LD = enreg
first : ^nœud
last : ^nœud
fenreg
noeud = enreg
val : valeur
pred : ^nœud
next : ^nœud
fenreg
69
LISTES CHAÎNÉES- Liste chaînée double
Exemple : liste = ( 1 , 2 , 3 , 4) représentée par L
1 NIL 2
L 3
4 NIL
70
12