Académique Documents
Professionnel Documents
Culture Documents
Constante : NIL E
GESTION DYNAMIQUE DE LA MÉMOIRE
Opérations :
Avant Créer( p )
p : ^type_base
P !
Réservation (allocation) :
Après Créer( p )
P @0 P^
Créer( p )
@0
Libération :
Après Libérer( p )
@0
P
Libérer( p )
@0
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
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.
L ……. NIL
X
LISTES CHAÎNÉES
X NIL
LISTES CHAÎNÉES
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
LISTES CHAÎNÉES
Insertion après un élément: insérer x après y
L:
Y
……. NIL
X
LISTES CHAÎNÉES
insère_val(var L : LS1 ; get_élém( L : LS1 ; y : valeur ) : LS1
x,y:valeur) var p , pred : LS1
var p , pred : LS1 Début
Début p := L
pred := get_élém(L , y) pred := NIL
si pred ≠ NIL tant que p≠ NIL et p^.val ≠ y
alors créer( p ) faire
p^.val := x pred := p
p^.next := pred^.next p := p^.next
pred^.next := p fait
fsi si p = NIL
Fin alors get_élém := NIL
sinon get_élém := pred
fsi
Fin
LISTES CHAÎNÉES
Pré-condition : La liste est NON VIDE
Suppression en tête: Supprimer la tête de L
NIL
…….
LISTES CHAÎNÉES
L NIL NIL
L
NIL
L
NIL
LISTES CHAÎNÉES
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 faire
L := NIL pred := p
sinon p := p^.next
last := pred^.next fait
pred^.next := NIL get_pred_last := pred
fsi Fin
Libérer( last )
Fin
LISTES CHAÎNÉES
Suppression d’un élément x donné:
L
NIL
…….
X
LISTES CHAÎNÉES
Supprime_val(var L:LS1; x:valeur ) get_val( L : LS1 ; x : valeur ) : LS1
var pred , p : LS1 var p , pred : LS1
Début Début
pred := get_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)
sinon alors get_val := NIL %xɇL
p := pred^.next sinon get_val := pred
pred^.next := p^.next Fin
fsi
Si ( p ≠ NIL )
alors Libérer( p )
fsi
Fin
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 NIL
LISTES CHAÎNÉES
insère_tête( var L : LS2 ; x : valeur)
var p : ^noeud
Début
créer( p )
p^.val := x
p^.next := L.first
L.first := p
Si L.last = NIL
alors L.last := p
fsi
Fin
LISTES CHAÎNÉES
insère_queue( var L : LS2 ; x : valeur)
var p : ^noeud
Début
créer( p )
p^.val := x
p^.next := NIL
Si ( L.first = NIL )
alors L.first := p
sinon L.last^.next := p
fsi
L.last := p
Fin
LISTES CHAÎNÉES
insère_triée( var L : LS2 ;x :valeur) get_pred( L : LS2 ; x : valeur ) : ^noeud
var p , pred : ^noeud var p , pred : ^noeud
Début Début
créer( p ) p := L.first
p^.val := x pred := NIL
Si ( L.first = NIL ) tant que p ≠ NIL et p^.val < x faire
alors p^.next := NIL pred := p
L.first := p p := p^.next
L.last := p fait
sinon get_pred := pred
pred := get_pred(L , x) Fin
si pred = NIL
alors p^.next := L.first
L.first := p
sinon p^.next := pred^.next
pred^.next := p
fsi
fsi
Fin
LISTES CHAÎNÉES
L 1 NIL 2 3
4 NIL
LISTES CHAÎNÉES
insère_tête( var L : LD ; x : valeur)
var p : ^noeud
Début
créer( p )
p^.val := x
p^.next := L.first
p^.pred := NIL
Si L.first = NIL
alors L.last := p
sinon L.first^.pred := p
fsi
L.first := p
Fin
LISTES CHAÎNÉES
insère_queue( var L : LD ; x : valeur)
var p : ^noeud
Début
créer( p )
p^.val := x
p^.next := NIL
Si ( L.first = NIL )
alors L.first := p
p^.pred := NIL
sinon p^.pred := L.last
L.last^.next := p
fsi
L.last := p
Fin
LISTES CHAÎNÉES
insère_triée( var L : LD ;x :valeur)
var p , q : ^noeud
Début
créer( p )
p^.val := x
Si L.first = NIL
alors p^.next := NIL
p^.pred := NIL
L.first := p
L.last := p
sinon
q:= L.first
pred := NIL
tant que q ≠ NIL et q^.val < x faire
q := q^.next
fait
si q = L.first
alors p^.next := L.first
L.first^.pred := p
p^.pred := NIL
L.first := p
sinon p^.next := q
p^.pred:= q^.pred
q^.pred := p
fsi
fsi
Fin
LISTES CHAÎNÉES
Supprime_tête( var L : LD )
var p : ^noeud
Début
p := L.first
L.first := p^.next
if L.first = NIL
alors L.last := NIL
sinon L.first^.pred := NIL
fsi
Libérer( p )
Fin
LISTES CHAÎNÉES
Supprime_queue( var L : LD )
var last : ^noeud
Début
last := L.last
L.last := L.last^.pred
Si ( L.last = NIL )
alors L.first := NIL
sinon
L.last^.next := NIL
fsi
Libérer( last )
Fin
LISTES CHAÎNÉES
Supprime_val(var L:LD; x:valeur )
var p : ^noeud
Début
p := L.first
tant que p ≠ NIL et p^.val ≠ x faire
p := p^.next
fait
Si (p ≠ NIL)
alors Si ( p = L.first )
alors L.first := L.first^.next
Si L.first = NIL
alors L.last = NIL
sinon L.first^.pred := NIL
fsi
sinon p^.pred^.next := p^.next
p^.next^.pred := p^.pred
fsi
libérer(p)
fsi
Fin