Vous êtes sur la page 1sur 59

Université Saad Dahlab – Blida1

Faculté des Sciences


Département d’Informatique
Licence d’Informatique
Semestre 3 (2ème année)

ALGORITHMIQUE & STRUCTURES


DE DONNÉES (ASD)

Mme AROUSSI

2017-2018

Disponible sur https://sites.google.com/a/esi.dz/s-aroussi/


PRÉAMBULE

Pré-requis: Cours (Algo1, S1) + (Algo 2, S2).

Volume horaire hebdomadaire: 3H Cours + 3H


TD/TP

Évaluation: 2 Interrogations (I1, I2) + 2 Tests TP (T1, T2)


+ Examen final.
Note TD: I1 noté sur 7,5 points; I2 noté sur 7,5 points; 3 points
présence et 2 points assiduité
Note TP: T1 noté sur 8 points; T2 noté sur 7 points; 3 points
présence et 2 points assiduité
Contrôle Continu (CC) = (TD + TP)/2
2
Moyenne = (Examen x 2 + CC) / 3
Coefficient 3; Crédits 6
OBJECTIFS DU COURS
Comprendre les notions d’algorithme, de structures de données
et de complexité :
Élaborer des algorithmes performants et efficaces
Acquérir la connaissance des structures de données séquentielles
(LLC, Files et Piles), hiérarchiques (arbres) et des algorithmes de
base sur les tris.
Maîtriser la récursivité (simple, multiple, mutuelle, imbriquée)
Comprendre la notion de complexité d’un algorithme
Savoir estimer la complexité d’un algorithme itératif ou récursif
3
CONTENU DU COURS

I. Rappels

II. Structures Séquentielles (Listes, Files, Piles)

III. Complexité des Algorithmes

IV. Récursivité

V. Structures Hiérarchiques (Arbres, ABR, AVL,


Tas)

VI. Algorithmes de Tri


4
VII. Ensembles
Université Saad Dahlab – Blida 1
Faculté des Sciences
Département d’Informatique
Licence d’Informatique
Semestre 3 (2ème année)
Algorithmique & Structures de Données

CHAPITRE I:
RAPPELS
Mme AROUSSI

2017-2018

Disponible sur https://sites.google.com/a/esi.dz/s-aroussi/


PLAN DU CHAPITRE I

Généralités sur l’Algorithmique

Algorithmique et Programmation

Qualités d’un Bon Algorithme

Langage Algorithmique utilisé

Tableaux

Langage C

Pointeurs 6
GÉNÉRALITÉ SUR L’ALGORITHMIQUE

Historique : L’algorithmique est un terme d’origine arabe,


hommage à Al Khawarizmi (780-850) auteur d’un ouvrage décrivant
des méthodes de calculs algébriques.

Définition: Un algorithme est suite finie d’opérations


élémentaires constituant un schéma de calcul ou de résolution d’un
problème.

7
GÉNÉRALITÉ SUR L’ALGORITHMIQUE
ÉTAPES DE CONCEPTION D’UN ALGORITHME

Définition du problème en terme


Analyse de séquences d’opérations de
calcul, de stockage de données

Définition précise des données,


des traitements et de leur Conception
séquencement

Traduction et réalisation de
Programmation l’algorithme dans un langage
précis

8
Vérification du bon
fonctionnement de l’algorithme Test
ALGORITHMIQUE & PROGRAMMATION

Définition : Un programme est la traduction d’un algorithme


dans un langage de programmation.

Évolution
Langage
de haut
niveau
Orienté Objet
(C++, C#, Java),
Binaire, Procédural ....
Assembleur (Pascal, C),
Logique (Prolog),
Langage .... 9
de bas
niveau
ALGORITHMIQUE & PROGRAMMATION
DÉMARCHE DE PROGRAMMATION

Choisir un
Énoncé du Analyse du
Algorithme langage de
problème problème programmation

Traduction du code Compilation


objet en code Programmation
machine exécutable, (traduction du Programme (traduction
compréhensible par code source en (code source) l’algorithme en
programme)
l'ordinateur code objet)

Programme
Exécution du
binaire Résultats
programme 10
exécutable
QUALITÉ D’UN BON ALGORITHME

Correct: Il faut que le programme exécute correctement ses


tâches pour lesquelles il a été conçu.

Complet: Il faut que le programme considère tous les cas


possibles et donne un résultat dans chaque cas.

Efficace: Il faut que le programme exécute sa tâche avec


efficacité de telle sorte qu’il se déroule en un temps minimal et

qu’il consomme un minimum de ressources.


11
LANGAGE ALGORITHMIQUE UTILISÉ

Entête ALGORITHME Nom_de_l’algorithme

Environnement Déclarations des objets et Modules utilisés


dans l’algorithme

DEBUT

manipulation des objets et modules déclarés


Corps

FIN
12
LANGAGE ALGORITHMIQUE UTILISÉ
LA CONDITIONNELLE ET L’ALTERNATIVE

SI expression logique ALORS SI expression logique ALORS


DSI DSI

Bloc Bloc1

FSI FSI

SINON
DSINON

Bloc2

FSINON
_
13
LANGAGE ALGORITHMIQUE UTILISÉ
LES BOUCLES

POUR var ALLANT DE vinit A vfinale PAS i FAIRE

DPOUR

Bloc

FPOUR

TANT QUE condition FAIRE REPETER


DTQ
Bloc Bloc
14

FTQ JUSQU'A condition


LANGAGE ALGORITHMIQUE UTILISÉ
LES OBJETS

Tout algorithme utilise des objets qui seront déclarés

dans son environnement.

A chaque objet, il faudra faire correspondre :

Un NOM qui permettra de le désigner et de le distinguer des autres

éléments,

Un TYPE qui indique la nature de l'ensemble dans lequel l'objet

prend ses valeurs, 15

Une VALEUR affectée à cet objet à un moment donné.


ALGORITHME nom_algorithme

Déclarations des étiquettes


Déclarations des constantes
Déclarations des types
Déclarations des variables
Déclarations des sous-programmes (modules)

DEBUT

corps de l'algorithme

16
FIN
LANGAGE ALGORITHMIQUE UTILISÉ
DÉCLARATION DE TYPES

Un type définit l'ensemble des valeurs que peut prendre un objet


qui y est défini ainsi que les opérations autorisées sur cet objet
Scalaire ( Entier, Booléen et
caractère)

Standard
Non Scalaire (Réel)
Simple
Enuméré
Non
Standard
TYPE Intervalle
Tableau

Structuré Chaine de caractère

17
Enregistrement (structure)

Ensemble
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ
Afin de gagner du temps et d’écrire des algorithmes plus courts
et plus structurés,
on regroupe un ou plusieurs blocs, qui réalisent un travail bien précis,
dans un MODULE, auquel on donne un nom
et que l’on peut ensuite « appeler »
chaque fois qu’on le désire, en faisant seulement référence à
son nom et sans avoir, bien entendu, à le reconstruire.

Type du module

(0 à n) entrées (0 à m) sorties
Nom du Module
(résultats)
18

Rôle du module
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ

Un module est une entité qui va effectuer un traitement, à partir


de 0 à n objets en entrée, pour fournir 0 à n sorties (ou résultats). Il est
identifié par un nom, qui va nous permettre de le distinguer, de le
déclarer et de l’appeler. Il a aussi un type qui va dépendre du nombre
de sorties du module. S’il n’a qu’une seule sortie qui ne fait pas objet
des paramètres d’entrée, il est de type FONCTION sinon il est de
type PROCEDURE. Et finalement, un rôle qui doit résumer avec
précision ce que fait ce module.

FONCTION PROCEDURE
(0 à n) une sortie (0 à n) (0 à n)
Nom Nom
entrées entrées sorties 19

Rôle Rôle
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ

Sur le plan syntaxique un module a le même schéma qu’un


algorithme avec une interface bien définie et un mécanisme qui assure
la communication entre les différents modules.

FONCTION Nom_fonction (paramètres formel d’entrée) : type du résultat


Déclarations des objets et Modules utilisés dans l’algorithme

DEBUT

manipulation des objets et modules déclarés

Retourner (résultat_de_la_fonction)
FIN
20
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ

Sur le plan syntaxique un module a le même schéma qu’un


algorithme avec une interface bien définie et un mécanisme qui assure
la communication entre les différents modules.

PROCEDURE Nom_procédure (paramètres formels d’entrée/sortie)


Déclarations des objets et Modules utilisés dans l’algorithme

DEBUT

manipulation des objets et modules déclarés

FIN
21
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ

Le mécanisme de communication est synthétisé dans le schéma


suivant et il est totalement transparent pour l’utilisateur, car il lui
suffit de faire correctement ses déclarations.

Quand l’appel à un module


est rencontré, l’exécution du
module appelant est suspendue
jusqu’à ce que le module appelé
soit totalement exécuté, puis
l’exécution du module appelant
repart immédiatement après
22
l’appel.
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ

Il existe deux façons pour passer les paramètres à un module:


1. Lorsqu’un paramètre est fourni à un module et que l’on
souhaite que le module nous restitue la même valeur que le
paramètre avait à l’entrée, on effectuera un passage par
valeur des paramètres.
Il est recommandé d'utiliser systématiquement un passage par
valeur pour les fonctions.

23
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ

Il existe deux façons pour passer les paramètres à un module:


2. Mais lorsqu’un paramètre d’entrée est modifié lors de
l’exécution du module et c’est le contenu modifié du paramètre
que l’on souhaite avoir, on effectuera un passage par
variable (ou par référence). Dans ce cas le paramètre formel
doit être précédé du mot VAR.
Par contre, il faut utiliser un passage par variable pour tous les
paramètres de sortie d’un module. Et cela est évident car un
paramètre de sortie est évalué dans le module et c’est bien
entendu ce résultat que l’on souhaite avoir en sortie.

24
LANGAGE ALGORITHMIQUE UTILISÉ
EXERCICE

Exercice : Soit P un polynôme de degré 2 qui s’écrit de la

forme suivante P(X) = a X2 +b X + c. Ecrire un programme

qui permet de

Lire les coefficients du polynôme

Evaluer le polynôme en un point x qui sera lu

Résoudre l’équation P(x) = 0 et afficher les résultats,


25
PLAN DU CHAPITRE I

Généralités sur l’Algorithmique

Algorithmique et Programmation

Qualités d’un Bon Algorithme

Langage Algorithmique utilisé

Tableaux

Langage C

Pointeurs 26
TABLEAUX
NOTIONS DE BASE

C’est un objet décomposé en plusieurs éléments de même


type et dont chacun de ces éléments est repéré par un
indice (ou index).

éléments
7 5 6 3 2 1 1 4
0 1 2 3 4 5 6 7 Indices

Le nombre d'éléments du tableau constitue sa taille.

Le nombre d’indices qui permet de désigner un élément particulier


est appelée dimension du tableau.
27
Le type de l’indice est souvent intervalle [0 .. Taille-1].
TABLEAUX
NOTIONS DE BASE

La déclaration d’un tableau se fait en précisant le mot


TABLEAU, suivi de sa taille entre crochets et du type des
éléments.

Type Type_tableau = TABLEAU [taille] DE type_des_éléments, et


Nom_du_tableau : Type_Tableau, ou

Nom_du_tableau : TABLEAU [taille] DE type_des_éléments

L’accès à un élément du tableau s’effectue en précisant le nom du


tableau suivi de la valeur de l’indice entre crochets, e.g: Tab[1].

L'accès à un élément du Tableau peut être direct ou séquentiel.


28
TABLEAUX
ALGORITHMES

On distingue généralement deux classes d’algorithmes:


Les algorithmes de parcours en vu de réaliser un traitement
donné

Les algorithmes de parcours en vu de rechercher une valeur


donnée.

Parmi les algorithmes traitant les tableaux à une


dimension:
Rechercher une valeur dans un tableau
si tableau ordonné alors recherche dichotomique
29
si tableau non ordonné alors recherche séquentielle
TABLEAUX
ALGORITHMES

Parmi les algorithmes traitant les tableaux à une


dimension:
La recherche d’une valeur

L’insertion d’une valeur

La suppression (logique ou physique) d’une valeur

Le remplacement d’une valeur par une autre (la modification)

L’interclassement de deux tableaux ordonnés.

L’union et l’intersection de deux tableaux.

Le tri d’un tableau: tri par sélection, tri par Bulles, tri par
30

insertion, tri par fusion, tri rapide, …..


TABLEAUX MULTIDIMENSIONNELS
Un tableau multidimensionnel est considéré comme étant un
tableau dont les éléments sont eux mêmes des tableaux.

Il se définit de la manière suivante :

Type Type_tableau = TABLEAU [N1, N2, ....., Nd] DE


type_des_éléments, et Nom_du_tableau : Type_Tableau,
ou
Nom_du_tableau: TABLEAU [N1, N2, ....., Nd] DE
type_des_éléments

d est la dimension du tableau et Ni désigne le nombre d’éléments


dans chaque dimension. 31

Le nombre de dimensions n'est pas limité .


TABLEAUX MULTIDIMENSIONNELS
L'accès à un élément du tableau se fera par l'expression

Nom_du_tableau[i1][i2] …[id] ou

Nom_du_tableau[i1, i2, …, id] .

Exemple: un tableau d'entiers positifs à deux dimensions

(3 lignes, 4 colonnes) se définira avec la syntaxe suivante :


Représentation du tableau
Tab : tableau[0..2,
Tab[0,0] 0..3] d’entier
Tab[0,1] Tab[0,2] Tab[0,3]
Tab[1,0] Tab[1,1] Tab[1,2] Tab[1,3]
Tab[2,0] Tab[2,1] Tab[2,2] Tab[2,3]
32
Le rangement en mémoire centrale du tableau se fait ligne par ligne.
PLAN DU CHAPITRE I

Généralités sur l’Algorithmique

Algorithmique et Programmation

Qualités d’un Bon Algorithme

Langage Algorithmique utilisé

Tableaux

Langage C

Pointeurs 33
LANGAGE C
PRÉSENTATION

Le langage C est né au début des années 1970 dans les


laboratoires AT&T aux Etats-Unis dans le but d’améliorer le
langage existant « B ».

C’est un langage de bas niveau dans le sens où il permet


l’accès aux données (bits, octets, adresses) que manipulent les
machines et qui ne sont pas souvent disponibles à partir de
langages évolués tels que Fortran, Pascal ou ADA

Il a été conçu pour l’écriture de systèmes d’exploitation et du


logiciel de base; Plus de 90% du noyau du système UNIX est
34
écrit en langage C.
LANGAGE C
POURQUOI L’APPRENDRE?

Sa popularité : Il possède une communauté très importante


et de nombreux tutoriels et documentations. De plus, il existe
beaucoup de programmes et de bibliothèques développés en C.

Sa rapidité : ce qui en fait un langage de choix pour tout


programme où le temps de réponse (exécution) est crucial.

Sa légèreté : ce qui le rend utile pour les programmes


embarqués où la mémoire disponible est faible.

Sa portabilité : un programme développé en C marche


théoriquement sur n’importe quelle plateforme (Windows,
35
Linus, Unix, Mac, …)
LANGAGE C
NORME
C est un langage qui possède des règles. Ces règles ont été
définies par des informaticiens professionnels et sont toutes
regroupées dans ce que l’on appelle la norme du langage.
Cette norme sert de référence à tous les programmeurs.

Il existe plusieurs normes : l’ANSI en 1989 (C89 ), l’ISO en


1990 (C90), le C99 et le C11.

Dans ce cours, nous allons nous servir de la norme utilisé C89


(http://flash-gordon.me.uk/ansi.c.txt).
En effet, même si c’est la plus ancienne et qu’elle semble restrictive à
certains, elle permet néanmoins de développer avec n’importe quel
36
compilateur sans problème, contrairement aux normes C99 et C11.

De plus, il est très facile ensuite de passer aux normes plus récentes.
LANGAGE C
OUTILS

Le strict minimum pour programmer en C se résume en


trois points:
Un éditeur de texte: pour écrire le code source.

Un compilateur: pour transformer le code en un fichier


exécutable compréhensible par le processeur.

Un débogueur: fondamentalement, il n’est pas indispensable,


mais il est très utile pour chasser les bugs et vérifier le
comportement de son programme.

37
LANGAGE C
OUTILS

Il existe deux moyens de récupérer tous ces logiciels :


On les prend séparément, et dans ce cas il faut compiler par
soi-même via l’invite de commande,

On utilise un environnement ou logiciel qui intègre les trois


logiciels: un Environnement de Développement Intégré (EDI)
ou Integrated Development Environment (IDE).

De nombreux IDE sont disponibles pour Windows:


Code::Blocks, Dev-C++, Visual C++,.....

Dans les TPs, nous allons nous servir du Code::Blocks


38
(http://www.codeblocks.org/downloads/binaries)
LANGAGE C (STRUCTURE)
Langage algorithmique Langage C
Algorithme Principal // directives
Programme principale

Déclarations // déclaration des variables globales


Début // prototype des fonctions
…actions… int main ()
Fin {
// déclarations des variables locales
// instructions
return 0 ;
}
Fonction id (décl. param.) : type type id (décl.param.)
Déclarations {
Début // déclarations
Fonction

…actions… // instructions
retourner expr return expr ;
Fin }
Procédure id (décl. param.) void id (décl. param.)
Procédure

Déclarations {
39
Début // déclarations
…actions… // instructions
Fin }
LANGAGE C
TYPE DE DONNÉES
Type de données Signification Nbr Plage de valeurs acceptées
Octets
char Caractère 1 - 128 à 127
unsigned char Caractère non signé 1 0 à 255

short int Entier court 2 -32 768 à 32 767


unsigned short int Entier court non signé 2 0 à 65 535
int Entier 2 -32 768 à 32 767
4 -2 147 483 648 à 2 147 483 647

unsigned int Entier non signé 2 0 à 65 535


4 0 à 4 294 967 295

long int Entier long 4 -2 147 483 648 à 2 147 483 647
unsigned long int Entier long non signé 4 0 à 4 294 967 295
float Flottant ou réel 4 3,4 x 10−38 à 3,4 x 1038 env.
40
double Flottant double 8 1,7 x10 −308 à 1,7 x10 308 env.
long double Flottant double long 10 3, 4 x10−4932 à 3, 4 x104932 env.
LANGAGE C (DÉCLARATION)
Déclaration Langage Algorithmique Langage C

Variable var id : type type id ;

Constante Const ID : type ←expr #define ID (expr)


const type ID = expr;

Tableau statique T: tableau [N] de type type T [N] ;

Chaine de caractères Ch: chaine [M] Char ch[M];

Pointeur Ptr: *type type* ptr;

Enregistrement structure id struct id {


déclaration des champs déclaration des champs
41
finStructure };
LANGAGE C
OPÉRATEURS
Langage Algorithmique Langage C

Affectation id_var ←expr id_var = expr ;

Arithmétiques +, -, *, /, %(modulo) , ++, +, -, *, /, %, ++, - -


--

Affectation composée exp1 = exp1 op exp2 exp1 op= exp2


+= , -= , *= , /= , %=

Logiques et, ou, non &&, ||, !

Comparaison =, ≠, <, ≤, >, ≥ ==, !=, <, <=, >, >=

Affectation conditionnel Si exp1 alors exp2 exp1 ? exp2 : exp342


ternaire Sinon exp3
LANGAGE C
STRUCTURES DE CONTRÔLE CONDITIONNELLES
Langage algorithmique Langage C
Si condition alors if (condition)
Dsi … Fsi {…;}

Si condition alors if (condition)


Dsi … Fsi {…;}
Sinon else
Dsinon … Fsinon {…;}
Selon expr switch (expr)
cas val1 : … {
. case val1 : … ; break ;
. .
cas valN : … .
cas sinon : … case valN : … ; break ;
finSelon default : …; 43

}
LANGAGE C
STRUCTURES DE CONTRÔLE ITÉRATIVES

Langage algorithmique Langage C


Pour i ← x a y pas de n faire for(v=x ;v<=y ;v=v+n)
DPour {
…actions.. …actions…..;
Fpour }
Tantque condition while (condition)
DTQ {
…actions… …instructions… ;
FTQ }
repeter do
…actions… {
Jusqu’à condition …instructions… ;
44
} while (non condition);
LANGAGE C
L’OPÉRATEUR SIZEOF
L’opérateur sizeof permet de calculer la taille
correspondant à un type.

sizeof (descripteur-de-type) représente la taille


(exprimée en octet) qu’occuperait en mémoire un objet
possédant le type indiqué

sizeof exp représente la taille qu’occuperait en


mémoire un objet possédant le même type que exp.

sizeof t ou sizeof t[0] où t est un tableau de taille n.


Cette formule exprime le nombre d’octets (n * sizeof(t)
45

) qu’occuperait le tableau.
LANGAGE C
FONCTIONS D’ENTRÉES-SORTIES
L’entête <stdio.h> (abréviation de standard in-out) fournit
trois flux que l’on peut utiliser directement :
stdin, l’entrée standard qui envoie au programme les données
issues du clavier, e.g:

scanf (format, &var1, &var2,..., &varn)


stdout, la sortie standard qui envoie les données que le
programme génère à l’écran, e.g.

printf (format, exp1, exp2, ... expn)


stderr, la sortie standard des erreurs qui seront affichées sur
46
l’écran.
LANGAGE C
FONCTIONS D’ENTRÉES-SORTIES

Déclaration lecture écriture format externe


int i; scanf("%d",&i); printf("%d",i); décimal
int i; scanf("%o",&i); printf("%o",i); octal
int i; scanf("%x",&i); printf("%x",i); hexadécimal
unsigned int i; scanf("%u",&i); printf("%u",i); décimal
short j; scanf("%hd",&j); printf("%d",j); décimal
short j; scanf("%ho",&j); printf("%o",j); octal
short j; scanf("%hx",&j); printf("%x",j); hexadécimal
unsigned short j; scanf("%hu",&j); printf("%u",j); décimal
long k; scanf("%ld",&k); printf("%d",k); décimal
long k; scanf("%lo",&k); printf("%o",k); octal
47
long k; scanf("%lx",&k); printf("%x",k); hexadécimal
unsigned long k; scanf("%lu",&k); printf("%u",k); décimal
LANGAGE C
FONCTIONS D’ENTRÉES-SORTIES

Déclaration lecture écriture format externe


float l; scanf("%f",&l); printf("%f",l); point décimal
float l; scanf("%e",&l); printf("%e",l); exponentielle
float l; printf("%g",l); la plus courte des deux
double m; scanf("%lf",&m); printf("%f",m); point décimal
double m; scanf("%le"&m); printf("%e",m); exponentielle
double m; printf("%g",m); la plus courte
long double n; scanf("%Lf"&n); printf("%Lf",n); point décimal
long double n; scanf("%Le"&n); printf("%Le",n); exponentielle
long double n; printf("%Lg",n); la plus courte
char o; scanf("%c",&o); printf("%c",o); caractère
48
scanf("%s",p); printf("%s",p);
char p[10]; chaîne de caractères
scanf("%s",&p[0]);
PLAN DU CHAPITRE I

Généralités sur l’Algorithmique

Algorithmique et Programmation

Qualités d’un Bon Algorithme

Langage Algorithmique utilisé

Tableaux

Langage C

Pointeurs 49
POINTEURS
VERSUS VARIABLES

Une variable est destinée à contenir une valeur du type


avec lequel elle est déclarée. Physiquement, cette valeur se
situe en mémoire.

Exemple:

x: entier;

x ←10;
50
POINTEURS
DÉFINITIONS ET OPÉRATIONS

Un pointeur est une variable destinée à contenir une adresse


mémoire, c.-à-d. une valeur identifiant un emplacement en mémoire.

Pour différencier un pointeur d'une variable ordinaire, on fait


précéder son nom de l’opérateur unaire d’indirection « * » lors de sa
déclaration.

Tout pointeur est associé à un type d’objet. Ce type est celui des
objets qui sont manipulables grâce au pointeur.

Les opérations les plus simples sur un pointeur sont les suivantes :

affectation d’une adresse au pointeur ;

utilisation du pointeur pour accéder à l’objet dont il contient


51
l’adresse.
POINTEURS
DÉFINITIONS ET OPÉRATIONS

Exemple:

x: entier; x ←10; px: * entier;

px ← &x; // affectation d’une adresse au pointeur ;

*px ← 20

52
20
POINTEURS
ALLOCATION DYNAMIQUE DU MÉMOIRE

La déclaration de variables réserve de l'espace en


mémoire pour ces variables pour toute la durée de vie du
programme c’est ce qu’on appelle l’allocation statique.

Elle impose par ailleurs de connaître avant le début de


l'exécution l'espace nécessaire au stockage de ces
variables, en particulier la dimension des tableaux.

Or dans de nombreuses applications, le nombre


d'éléments d'un tableau peut varier d'une exécution du
programme à l'autre d’où l’allocation dynamique. 53
POINTEURS
ALLOCATION DYNAMIQUE DU MÉMOIRE

Pour ce faire, on utilise des pointeurs.

Quand on fait une allocation dynamique de mémoire, on


obtient en retour un pointeur sur la zone mémoire allouée.

Algorithmique Langage C Rôle


ptr: *type type * ptr = NULL; Déclare un pointeur
TAB Nil
ptr←(*type) ptr =(type *) Retourner un pointeur pointant
allouer() malloc(sizeof(type)); vers un objet de type type.

liberer(ptr) free(ptr); Libérer l’espace mémoire alloué


à un pointeur « ptr ». 54

Les fonctions de langage C sont disponibles dans la bibliothèque <stdlib.h>


POINTEURS
& LES TABLEAUX

Par défaut, le tableau est de grandeur statique, i.e. qu’il


est impossible de les changer de taille après la
compilation.

Il est cependant possible de changer la taille après la


compilation. C’est ce qu’on appelle les tableaux
dynamiques.

Pour faire des tableaux dynamiques, il faut réserver un


espace mémoire d’une taille donnée puis d’assigner un
pointeur à cet espace mémoire. 55
POINTEURS
& LES TABLEAUX

Algorithmique Langage C Rôle


TAB: *type type * TAB = Déclarer un tableau
TAB Nil NULL;
TAB←(*type) TAB =(type *) Allouer une plage mémoire à un
allouerTab(N) malloc(N* tableau de N éléments de type «
sizeof(type)) type»,
TAB = (type *) Allouer une plage mémoire à un
calloc(N, tableau de N éléments de type «
sizeof(type)); type » dont les valeurs sont
initialisées à zéro
liberer(TAB) free(TAB); Libérer l’espace mémoire alloué
à un pointeur « ptr ».
56
Ces fonctions sont disponibles dans la bibliothèque <stdlib.h>
POINTEURS
& LE PASSAGE PAR VARIABLE

Une autre utilité des pointeurs dans le langage C est de


permettre le passage par variable des paramètres dans
les procédures

Exemple:
Algorithmique Langage C
Procedure permuter (Var x, y: entier) void permuter(int *ptrx, *ptry)
Var {
Tmp; entier; int Tmp;
Debut Tmp = *ptrx;
Tmp ← x; *ptrx = *ptry;
x ← y; *ptry = tmp;
y ← tmp; }
Fin 57

Appel: Appel: x=5; y=80; permuter (&x, &y)


x 5; y 80; permuter (x, y)
POINTEURS
& AUTORÉFÉRENCE

On a souvent de modèles de structure dont un des


membres est un pointeur vers une structure de même
modèle. On parle de l’autoréférence

Cette représentation permet de construire des listes


chaînées et des arbres.
Algorithmique Langage C

Listes maillon: structure { struct maillon {


chainées val: entier; char nom[30];
suiv: * maillon; struct maillon *suiv;
}; }; 58
SOURCES DE CE COURS
N. EL-ALLIA , Cours d’Algorithmique et Structures de données
dynamiques, Ecole nationale Supérieure d’Informatique (ESI), 2010.

Djamel Eddine ZEGOUR, Cours de Structures de Données, Ecole nationale


Supérieure d’Informatique (ESI), Disponible sur
http://zegour.esi.dz/Cours/Cours_sdd.htm

M. Le Gonidec, Introduction à la Programmation – Pratique du Langage C


–, Université du Sud, disponible sur http://legonidec.univ-tln.fr/0-Cours.pdf

Maude Manouvrier, Initiation à la Programmation Procédurale, à


L'algorithmique Et aux structures de Données par le Langage C,
Université Paris Dauphine, 2015, disponible sur
http://www.lamsade.dauphine.fr/~manouvri/C/Polys_C_MM.pdf
59
Christian Bac, Support de Cours de Langage C; 2013; Disponible sur
http://picolibre.int-evry.fr/projects/svn/coursc/Index.pdf