Académique Documents
Professionnel Documents
Culture Documents
de l’Informatique et du Numérique
Algorithmique et Structures de
Données Dynamiques
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 :
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.
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.
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é
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.
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 :
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 :
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 :
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.
154 45 11 458
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.
154 45 11 458
154 45 11 458
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 :
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