Vous êtes sur la page 1sur 35

Ecole Supérieure en Sciences et Technologies

de l’Informatique et du Numérique

Chapitre I: Listes Linéaires Chainées

Algorithmique et Structures de
Données Dynamiques

1re année Ecole Prépa. De l’ESTIN de Bejaia

Année: 2020-2021
Chapitre I: Pointeurs & LLC
Introduction
La représentation d’un groupe de données de même type n’est possible
qu’au moyen des tableaux. Or leur facilité d’utilisation peut être
fortement réduite lorsque le nombre maximal d’éléments du tableau
n’est pas connu à la compilation (ne peut être fixé par le programmeur).
A cet effet :

— Si ce nombre est choisi trop petit le programme ne pourra


représenter et traiter toutes les données;

— S’il est pris (beaucoup) trop grand le gaspillage de mémoire peut


pénaliser non seulement le fonctionnement du programme mais
aussi celui du système informatique entier.

2
Chapitre I: Pointeurs & LLC
Introduction
 Exemple :
Recherche de tous les nombres premiers dans l’intervalle [2, 10000], puis
les stocker dans une structure de données (tableau par exemple).
— L’algorithme est simple, mais …
Quelle est la taille du tableau?
— Fixer la taille arbitrairement entraine une mauvaise utilisation de la
mémoire.

— De ce fait, l’allocation statique de la mémoire pose de problème !

 L’utilisation d’une allocation dynamique est donc indispensable.

Les pointeurs 3
Chapitre I: Pointeurs & LLC
Introduction
 Mémoire et Variables :
— La Mémoire Centrale (MC) est un ensemble de cases numérotés ou
chacune peut stocker 1 octet (8 bits).
— En mémoire centrale, une variable est une zone contigüe dont la
taille dépond de son type.
— Le numéro de la première case qu’occupe une variable représente
son adresse mémoire.

 Déclaration de Variables :
— La déclaration de variables est en effet une allocation mémoire
permettant de créer la variable.

4
Chapitre I: Pointeurs & LLC
Introduction
 Allocation Mémoire :
L’allocation mémoire est une réservation d’espace à la variable en
question en lui associant l’adresse d’une zone vide en mémoire.

— Nous distinguons deux types d’allocation mémoire :


 Statique (gérée automatiquement par le système)
 Dynamique (gérée manuellement par le programmeur)

— Toutes les variables déclarées représentent des variables allouées


statiquement.

5
Chapitre I: Pointeurs & LLC
Les Pointeurs
 Définition :
Un pointeur est une variable qui peut contenir l’adresses d’autres
variables.
Une variable de type pointeur est une variable dont la valeur est
l’adresse d’une autre variable.

 Exemple : 00000
00001
Nb est une variable de type entier, 00010
caractérisée par une adresse= (00011)2 et une Nb
00011 100
valeur =(100)2
P est une variable de type pointeur, caractérisée
par une adresse= (01000)2 et une valeur =(00010)2
qui est l’adresse de la variable Nb.
01000 00011 P 6
Chapitre I: Pointeurs & LLC
Les Pointeurs
 Déclaration :
Un pointeur est souvent typé de manière à préciser quel type d’objet il
désigne dans la mémoire.

 Syntaxe en algorithmique:
Var <NomPointeur> : pointeur (<TypeDeDonnées>)
TypeDeDonnées : représente le type de la variable pointée.
 Syntaxe en C : <TypeDeDonnées> * <NomPointeur>

 Exemple :
 En algorithmique : Var P : pointeur (Entier)
 En C : Int * P
7
Chapitre I: Pointeurs & LLC
Les Pointeurs
 Opérations sur les pointeurs :
— Il est possible d’initialiser une variable de type pointeur.
 Exemple :
 En algorithmique :
Nb ← 110101
P1 ← Adr(Nb) {la variable P1 a comme valeur l’adresse de la variable Nb (00011)}
P2← Nil {P2 ne pointe rien, sa valeur est nulle}
X ← Valeur (P) {X aura la valeur de la variable Nb pointée par P (X = 110101) }

 En C :
Nb = 110101
P1 = &Nb
P2 = Nil
X = *P

8
Chapitre I: Pointeurs & LLC
Les Pointeurs
 Allocation d’espace mémoire :
00000
La réservation d’espace d’un pointeur P sur un type 00001 Espace
quelconque se fait à travers la fonction ‘Allouer(P)’. 00010 Réservé

 Allouer(P): permet de réserver un espace mémoire de 00011 Pour un


même taille que le type de la variable pointée. Cette Entier
fonction retourne l’adresse de l’emplacement dans le
pointeur P.
01000 P
 Exemple :
 En algorithmique :  En C :
Var P : Pointeur(entier) Int *P;
Début P = malloc(sizeof(int)); ou bien :
Allouer(P) P=malloc(sizeof(*P));

9
Chapitre I: Pointeurs & LLC
Les Pointeurs
 Libération d’espace mémoire :
La Libération d’espace occupé par un pointeur P sur un type quelconque
se fait à travers la fonction ‘Libérer(P)’.
 Libérer(P): permet de récupérer (libérer) un espace mémoire déjà
alloué. Cette opération est recommandée lorsqu’un emplacement
mémoire n’est plus utilisé.
Cette opération ne renvoie rien. La mémoire pointée par P est
restituée.
 Exemple :
 En algorithmique :  En C :
Var P : Pointeur(entier) Int *P;
Début P=malloc(sizeof(*P));
Allouer(P) ….
…..
Libérer(P) Free(P)
10
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées (LLC)
 Définitions :
Une Liste Linéaire Chaînée est une structure de données dynamique qui
représente un ensemble finis d’éléments (maillons) chaînés entre eux.

Un maillon est un enregistrement composé de deux parties:


 valeur: elle représente le contenu du maillon, elle peut être une
variable simple (entier, réel,…), ou bien une variable composée
(enregistrement, tableau,…)
 adresse: c’est un pointeur vers l’élément suivant

11
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées (LLC)
 Caratéristiques :
— Dans le dernier maillon de la liste, le champ adresse contient le pointeur NIL
(indiquant par convention la fin de la liste).
— Le premier élément de la liste est appelé ‘Tête’.
— Le dernier élément est appelé ‘Queue’.

12
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées (LLC)
 Déclaration :
 Syntaxe en algorithmique:
Type Tmaillon = Structure {ou Tmaillon = enregistrement}
Valeur : <typequelconque>
Adresse : Pointeur(Tmaillon)
Fin Structure {ou Fin enregistrement}
Var Tête : Pointeur(Tmaillon)

 Syntaxe en C :
Typedef Struct {
<typequelconque> Valeur;
Tmaillon * Adresse ;
} Tmaillon ;
Var Tmaillon * Tête ;
13
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées (LLC)
 Remarques :
— Il ne faut jamais perdre le pointeur de la première cellule (Tête).
— Le dernier élément d'une liste chaînée doit pointer sur NIL (ou
Null) pour indiquer la fin d'une liste.
— Cette convention implique que la liste chaînée vide est NIL.

14
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées (LLC)
 Opérations Possibles sur les LLC :
— De même que sur les vecteurs, on peut classer les algorithmes sur
les LLCs comme suit :

 Parcours : accès par valeur, accès par position,


 Mise à jour : insertion, suppression,
 Algorithmes sur plusieurs LLCs : fusion, interclassement,
éclatement,...
 Tri sur les LLCs.

15
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées (LLC)
 Modèle sur les LLC :
— Afin de développer des algorithmes sur les LLCs, on construit
une machine abstraite avec les opérations définies comme suit :

Allocation d'un espace dont l'adresse est rendue dans la


Allouer(P)
variable POINTEUR ‘P’
Valeur(P) Consultation du champ Valeur du maillon d'adresse ‘P’
Suivant(P) Consultation du champ Adresse du maillon d'adresse ‘P’
Rangement de l’adresse ‘Q’ dans le champ Adresse du maillon
Aff_Adr(P, Q)
d'adresse ‘P’
Rangement de la valeur ‘Val’ dans le champ Valeur du maillon
Aff_Val(P,Val)
d'adresse ‘P’

16
Chapitre I: Pointeurs & LLC
Les LLC Particulières
 Listes bidirectionnelles :
C'est une Liste Linéaire doublement Chainées que l'on peut parcourir dans
les deux sens.
— Schématiquement, elle se présente comme suit :

Nil 154 45 11 458 Nil

— Le type d’un maillon est définie comme suit :


Type Tmaillon = Structure
Valeur : <typequelconque>
Suivant, Précèdent : Pointeur(Tmaillon)
Fin Structure
Var Tête, Queue : Pointeur(Tmaillon)
17
Chapitre I: Pointeurs & LLC
Les LLC Particulières
 Listes bidirectionnelles :
— Le modèle des LLCs est étendu par les opérations suivantes:

Précédent(P) Accès au champ adresse gauche du maillon d'adresse ‘P’


Rangement de l’adresse ‘Q’ dans le champ ‘Précèdent’
Aff_Adrg(P,Q)
(adresse gauche) du maillon d'adresse ‘P
Rangement de l’adresse ‘Q’ dans le champ ‘Suivant’
Aff_Adrd(P,Q)
(adresse droite) du maillon d'adresse ‘P

18
Chapitre I: Pointeurs & LLC
Les LLC Particulières
 Listes circulaires ou anneau:
C'est une LLC telle que le dernier élément pointe sur le premier. Elle est
définie par l'adresse d'un élément quelconque.

— Schématiquement, elle se présente comme suit :

154 45 11 458

— Quelle est la différence ? Le dernier maillon

19
Chapitre I: Pointeurs & LLC
Les LLC Particulières
 Listes bidirectionnelles circulaires :
C'est une LLC à double sens et dont le dernier/premier pointe sur le
premier/dernier.

— Schématiquement, elle se présente comme suit :

154 45 11 458

— Quelle est la différence ?


20
Chapitre I: Pointeurs & LLC
Les LLC Particulières
 Listes bidirectionnelles circulaires :
C'est une LLC à double sens et dont le dernier/premier pointe sur le
premier/dernier.

— Schématiquement, elle se présente comme suit :

154 45 11 458

— Quelle est la différence ?


21
Chapitre I: Pointeurs & LLC
Les LLC
 Représentation :
Il existe plusieurs méthodes pour implémenter des listes. Les plus
courantes sont l’utilisation des tableaux (représentation contiguë) et des
pointeurs (représentation chaînée).
 Représentation Contiguë (tableau) :
Les éléments de la liste sont simplement rangés dans le tableau à leur
place respective séquentiellement (les un à la suite des autres).
 Inconvénients :
— La dimension d’un tableau doit être définie lors des déclarations
et ne peut donc être modifiée. Si on définit une taille qui sera
suffisante pour accueillir le plus grand nombre d’éléments, on
risque de gaspiller de la mémoire. Si le nombre d’éléments est
augmenté, l’algorithme doit être modifié er recompilé.
22
Chapitre I: Pointeurs & LLC
Les LLC
 Représentation :
 Représentation Contiguë (tableaux) :
 Inconvénients :
— Lorsqu’on veut retirer (ou insérer) un élément du tableau ‘au
début’, il est nécessaire de décaler tous les éléments situés après
l’élément supprimé.

 Avantages :
— L’accès au Keme élément est immédiat: T[K]
— Trouver le suivant d’un élément est simple: T[K+1]

23
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
 Représentation :
 Représentation Chaînée (pointeurs) :
 Inconvénients :
— La liste est accessible uniquement par sa tête de liste c’est-à-dire
son premier élément,
— L’accès à un élément implique le parcours de tous les éléments
qui le précèdent.

 Avantages :
— La dimension n’est pas fixée au préalable,
— La mémoire est gérée économiquement (pas de gaspillage).

24
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
 Exercice 1:
Ecrire un algorithme qui permet de :
— Créer une liste chaînée d’entiers,
— Afficher la liste,
— Calculer la somme de ses éléments,
— Donner l’occurrence de la valeur V dans la liste
— Retourner le maximum de la liste
— Vérifier si une liste est triée en ordre croissant
— Libérer la liste.

25
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
 Solution :
Algorithme Exo_Liste
Type
Element = structure
Valeur : entier
Adresse : pointeur(Element)
Fin Structure
Var L : pointeur(Element)
S, Occ, Max, V: entier

26
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
Procédure Créer_Liste(Var Tête : pointeur(Element))
 Solution : Var Q, P : pointeur(Element)
V : entier
Début
Ecrire( "Introduire le nombre d’éléments de votre liste" )
Lire(N)
Tête ← Nil
Pour i allant de 1 à N faire
Allouer(Q)
Ecrire( "Introduire la valeur de l’élément ", i )
Lire(V)
Q.val ← V
Q.Suiv ← Nil
Si Tête = Nil Alors
Tête ← Q
Sinon
P.Suiv ← Q
FinSi
P←Q
FinPour
Fin 27
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
 Solution :
Procédure Afficher(Tête : pointeur(Element))
Var p :pointeur(Element);
Début
p ← Tête ;
Tantque ( p ≠ Nil ) faire
Ecrire(Valeur(p)) ;
p ← Suivant(p) ;
FinTantQue
Fin

28
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
 Solution :
Fonction Somme(Tête : pointeur(Element)) : entier
Var s :entier
p : pointeur(Element)

Début
s← 0
p ← Tête
Tantque (p ≠ Nil) faire
s ← s + Valeur(p)
p ← Suivant (p)
FinTantQue
Somme ← s
Fin

29
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
 Solution :
Fonction Occurence(Tête : pointeur(Element), x :entier) : entier
Var Nbocc : entier
P :pointeur(Element)
Début
Nbocc ← 0
p ← Tête
Tantque (p ≠ nil) Faire
Si (valeur(p) = x) Alors
Nbocc ← Nbocc+1
Finsi
p ← Suivant (p)
FinTantQue
Occurence ← Nbocc
Fin
30
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
 Solution :
Fonction Max_Liste(Tête : pointeur(Element)) : entier
Var max :entier
p : pointeur(Element)
Début
p ← Tête
max ← Valeur(p)
p ← Suivant (p)
Tantque (p ≠ Nil) Faire
Si (Valeur(p) > max) Alors
max ← Valeur(p)
Finsi
p ← Suivant (p)
FinTantQue
Max_liste ← max
Fin
31
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
 Solution : Fonction Liste_Triee(Tête: pointeur(Element)) : booléen
Var tri : booléen
P : pointeur(Element)
Début
tri ← vrai
p ← Tête
Tantque (Suivant(p) ≠ Nil) et (tri) Faire
Si (valeur(p) ≤ valeur(Suivant(p)) Alors
p ← Suivant (p)
Sinon
tri ← faux
Finsi
FinTantQue
Liste_Triee ← tri
Fin
32
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
Début {Début du programme principal}
 Solution : Créer_Liste(L) {Création de la liste avec la tête ‘L’}
Ecrire(" Les éléments de votre liste sont : ")
Afficher(L) {Affichage des éléments de la liste}
S ← Somme(L) {Calcul de la somme des éléments de la liste}
Ecrire(" La somme des éléments de la liste est : ", S)
Occ ← Occurrence(L,V) {Occurrence de la valeur ‘V’ dans la liste}
Ecrire(" L’occurrence de la valeur ‘V’ dans la liste est : ", Occ )
Max ← Max_Liste(L)
Ecrire(" La valeur maximale des éléments de la liste est : ", Max )
Si Liste_Triee(L) Alors
Ecrire(" La liste est triée suivant l’ordre croissant", Max )
Sinon
Ecrire(" La liste n’est pas triée suivant l’ordre croissant", Max )
Finsi
Fin {Fin du programme principal}
33
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
 Exercice 2:
Soit une liste d’entiers L, écrire les sous programmes permettant :

— L’insertion d’une valeur val donnée dans une liste triée,

— La suppression des doublons (éléments identiques),

— La création de la liste miroir de L ,

— La fusion de deux listes triées d’entiers L1 et L2 en une liste triée L3.

34
Chapitre I: Pointeurs & LLC
Les Listes Linéaires Chainées
 Exercice 3:

Soit L une liste d’entiers positifs. Ecrire une procédure qui permet
d’éclater la liste L en deux listes: Lp contenant les entiers pairs et Li
contenant les entiers impairs.

35

Vous aimerez peut-être aussi