0% ont trouvé ce document utile (0 vote)
18 vues12 pages

ASD Cours Listes Chaînées

Transféré par

Ryme Dridi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
18 vues12 pages

ASD Cours Listes Chaînées

Transféré par

Ryme Dridi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi