Vous êtes sur la page 1sur 55

Les structures de données linéaires

Pr. Mohamed EL ANSARI

Département d’Informatique
Faculté des Sciences, Université Ibn Zohr
Agadir

melansari@gmail.com

Filière: SMI4
Module: Algorithmes & Structures de données

Printemps
c 2011

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 1 / 37
Introduction

Introduction 1/2

Problème : Données → Algorithme → Solution


Les structures de données spécifient la façon de représenter les
données d’un problème.
Le choix d’une telle structure doit tenir compte de:
1 La place mémoire consommée par la structure.
2 La facilité qu’elle offre pour accéder à une certaine donnée.
Les structures de données sont définies indépendamment du langage
de programmation.
Différentes façon d’attribution et d’utilisation de la mémoire:
1 Variables isolées les unes des autres dans la mémoire.
2 Tableaux.
3 Pointeurs.

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 2 / 37
Introduction

Introduction 2/2

Attribution mémoire:
1 Par le compilateur et ne peut pas être modifiée au cours du programme
(variables statiques).
2 Effectuée pendant le déroulement du programme et peut donc varier
pendant celui-ci (varaibles dynamiques).
Les structures de données appartiennent le plus souvent aux familles
suivantes:
1 Les structures linéaires: tableaux, listes, piles, files.
2 Les structures arborescentes: arbres, arbres binaires.
3 Les structures relationnelles: graphes.

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 3 / 37
Les structures de données linéaires

Les structures de données linéaires

Les structures de données linéaires sont caractérisées par le fait que:


les données sont organisées sous forme d’une liste et
les données sont mises les unes derrière les autres.
Une liste peut être représentée par :
1 un tableau unidimensionnel ou
2 liste chaı̂née.
Nature des opérations autorsiées → Différents types de listes : les
piles, les files

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 4 / 37
Les listes

Les listes

Une liste est une suite d’éléments d’un type donné. Elle peut contenir
zéro, un ou plusieurs éléments.
Exemples :
1 (3, 7, 2, 8, 10, 4) est une liste d’entiers.
2 (lundi, mardi, mecredi, jeudi, vendredi, samedi, dimanche) est la liste
des jours de la semaine.
Une liste (ou liste chaı̂née) est une structure de données constituée
d’éléments contenant chacun :
1 des données utiles ou une référence (adresse, ou pointeur) sur des
données utiles;
2 une référence (adresse, ou pointeur) de l’élément suivant.
La liste est déterminée par la référence (adresse) de son premier
élément (nommé souvent tête de la lsite).
Le dernier élément de la liste pointe sur une adresse qui ne peut
contenir aucune donnée utile (l’adresse NULL en langage C).
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps
c 2011 5 / 37
Les listes Implémentation à l’aide d’un tableau

Implémentation à l’aide d’un tableau


Une liste peut être implémentée par un tableau (statique ou
dynamique).
Implémentation simple: les éléments de la liste sont rangés dans un
tableau.
Inconvénients:
L’insertion d’un élément: il faut décaler d’un cran tous les éléments
suivants (jusqu’à n+1 affectations).
La suppression d’un élément peut entraı̂ner jusqu’à n-1 afffectations.
Tableau statique:
La dimension doit être définie lors des déclarations et ne peut être
modifiée dynamiquement lors de l’exécution d’un programme.
Le tableau est surdimentionné! → Il encombre la mémoire de
l’ordinateur.
Avantages :
L’accès au Kème élément est immédiat : t[k]
Quelle implémentation? tableau ou liste chaı̂née? → Application
envisagée.
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps
c 2011 6 / 37
Les listes Réalisation d’une structure liste

Ré alisation d’une structure liste

Supposons que nous souhaitons créér une liste d’entiers, le type


structuré permettant de construire ladite liste est définie comme suit:
Un élément d’une liste d’entiers
struct Element{
int val;
struct Element *suivant;
};

La déclaration d’une liste nommée tete s’effectue de la fao̧n suivante:


Déclaration d’une liste
struct Element * tete = NULL; /* liste vide */

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 7 / 37
Les listes Représentation d’une liste

Représentation d’une liste

NULL

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 8 / 37
Les listes Représentation d’une liste

Représentation d’une liste

NULL
tête

Le nom de la liste.

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 8 / 37
Les listes Représentation d’une liste

Représentation d’une liste

NULL
tête
un élément de la liste

Le nom de la liste.
Un élément est une structure composée de :

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 8 / 37
Les listes Représentation d’une liste

Représentation d’une liste

NULL
tête
un élément de la liste

information
(entier, flottant, structure,...)

Le nom de la liste.
Un élément est une structure composée de :
l’information utile (type prédéfinie ou définie par le programmeur);

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 8 / 37
Les listes Représentation d’une liste

Représentation d’une liste

NULL
tête
un élément de la liste

information
(entier, flottant, structure,...)

adresse de l'élément suivant

Le nom de la liste.
Un élément est une structure composée de :
l’information utile (type prédéfinie ou définie par le programmeur);
l’adresse de l’élément suivant

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 8 / 37
Les listes Représentation d’une liste

Représentation d’une liste

NULL
tête
un élément de la liste

marque la fin de la liste


information
(entier, flottant, structure,...)

adresse de l'élément suivant

Le nom de la liste.
Un élément est une structure composée de :
l’information utile (type prédéfinie ou définie par le programmeur);
l’adresse de l’élément suivant
En langage C, NULL est utilisé pour marquer la fin de la liste.

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 8 / 37
Les listes Création d’un élément de la liste

Cré ation d’un é lé ment de la liste 1/2

Considérons la structure:
struct Element{
int val;
struct Element *suivant;
};
typedef struct Element LISTE;

Instructions en C
LISTE *liste= 0;
liste =new LISTE; Mémoire
liste->val = 145;
liste->suivant = 0;

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 9 / 37
Les listes Création d’un élément de la liste

Cré ation d’un é lé ment de la liste 1/2

Considérons la structure:
struct Element{
int val;
struct Element *suivant;
};
typedef struct Element LISTE;

Instructions en C
LISTE *liste= 0; Mémoire
liste =new LISTE;
liste->val = 145; 22
liste->suivant = 0;

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 9 / 37
Les listes Création d’un élément de la liste

Cré ation d’un é lé ment de la liste 1/2

Considérons la structure:
struct Element{
int val;
struct Element *suivant;
};
typedef struct Element LISTE;

Instructions en C
LISTE *liste= 0; Mémoire
liste =new LISTE;
0
liste->val = 145; 22
liste->suivant = 0;

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 9 / 37
Les listes Création d’un élément de la liste

Cré ation d’un é lé ment de la liste 1/2

Considérons la structure:
struct Element{
int val;
struct Element *suivant;
};
typedef struct Element LISTE;

Instructions en C
LISTE *liste= 0; Mémoire
liste =new LISTE;
0
liste->val = 145; 22 32 36
liste->suivant = 0;

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 9 / 37
Les listes Création d’un élément de la liste

Cré ation d’un é lé ment de la liste 1/2

Considérons la structure:
struct Element{
int val;
struct Element *suivant;
};
typedef struct Element LISTE;

Instructions en C
LISTE *liste= 0; Mémoire
liste =new LISTE;
32
liste->val = 145; 22 32 36
liste->suivant = 0;

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 9 / 37
Les listes Création d’un élément de la liste

Cré ation d’un é lé ment de la liste 1/2

Considérons la structure:
struct Element{
int val;
struct Element *suivant;
};
typedef struct Element LISTE;

Instructions en C
LISTE *liste= 0; Mémoire
liste =new LISTE;
32 145
liste->val = 145; 22 32 36
liste->suivant = 0;

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 9 / 37
Les listes Création d’un élément de la liste

Cré ation d’un é lé ment de la liste 1/2

Considérons la structure:
struct Element{
int val;
struct Element *suivant;
};
typedef struct Element LISTE;

Instructions en C
LISTE *liste= 0; Mémoire
liste =new LISTE;
32 145 0
liste->val = 145; 22 32 36
liste->suivant = 0;

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 9 / 37
Les listes Création d’un élément de la liste

Cré ation d’un é lé ment de la liste 2/2


On peut définir une fonction qui se charge de la crétaion d’un élément (appelé aussi maillon).
L’élément pourra par la suite rajouté à une liste.

Création d’un maillon


LISTE * elem_new(int val)
{
LISTE *new_elem;
new_elem = (LISTE*)malloc(sizeof(LISTE));
new_elem->val = val;
new_elem->suivant = NULL;
return new_elem;
}

Pour la libération de l’espace alloué à un élément:

Libération d’un maillon


void * elem_free(LISTE *elem)
{
free(elem);
}

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 10 / 37
Les listes Procédures de manipulation des listes

Procédures de manipulation des listes

Les procédures de manipulations concernent:


1 l’initialisation d’une liste (en général, liste vide);
2 tester si une liste est vide;
3 passage à l’élément suivant d’une liste;
4 l’ajout d’un élément dans une liste, au début, à la fin, ou entre deux
éléments;
5 la suppression d’un élément d’une liste;
6 le parcours de la liste;
7 concaténation de deux listes contenant des éléments du même type;
8 ...

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 11 / 37
Les listes Procédures de manipulation des listes

Quelques opé rations utiles sur les listes


Parcours d’une liste en vue de calculer le nombre d’éléments qui la compose (utilisation de la
boucle while).

Taille d’une liste


int list_length(LISTE *L){
int len=0;
while (L != NLL){
L = L->suivant; len++;
}
return len;
}

Parcours des éléments d’une liste afin de les afficher (utilisation de la boucle for).

Impression d’une liste


void list_print(LISTE *L){
int i;
for (i=0 ; L ; num++, L = L->suivant)
printf("Element %d = %d\n", num, L->val);
}

La fonction ci-dessous permet d’afficher l’indice et la valeur des éléments de la liste.


Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps
c 2011 12 / 37
Les listes Procédures de manipulation des listes

Insertion des éléments dans une liste

Au moment de sa création, une liste doit être initialisée. En général,


on lui affecte la valeur NULL.
Une fois un élément est créé, son insertion peut être effectué soit :
au début de la liste (tête), direcetement accessible au travers du
pointeur représentant la liste, ou
à la position n de la liste, nécessite de parcourir les n-1 premiers
éléments de la liste.

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 13 / 37
Les listes Procédures de manipulation des listes

Insertion des éléments dans une liste


En tête de la liste 1/2

Supposons que nous disposons d’une liste L et un élément elem qu’on


souhaite insérer à la tête de L.
Mémoire
L 20
Code en C
0
0

20
elem->suivant = L;
L = elem;
elem 46 0

46

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 14 / 37
Les listes Procédures de manipulation des listes

Insertion des éléments dans une liste


En tête de la liste 1/2

Supposons que nous disposons d’une liste L et un élément elem qu’on


souhaite insérer à la tête de L.
Mémoire
L 20
Code en C
0
0

20
elem->suivant = L;
L = elem;
elem 46 20

46

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 14 / 37
Les listes Procédures de manipulation des listes

Insertion des éléments dans une liste


En tête de la liste 1/2

Supposons que nous disposons d’une liste L et un élément elem qu’on


souhaite insérer à la tête de L.
Mémoire
L 46
20
Code en C
0
0

20
elem->suivant = L;
L = elem;
elem 46 20

46

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 14 / 37
Les listes Procédures de manipulation des listes

Insertion des é lé ments dans une liste


En tê te de la liste 2/2

On peut écrire les instructions d’insertion en tête sous forme d’une


fonction.
Insérer un élément en tête
LISTE * list_push(LISTE *L, LISTE * elem){
elem->suivant = L;
return elem;
}

...

L = list_push(L, elem_new(12));

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 15 / 37
Les listes Procédures de manipulation des listes

Insertion des éléments dans une liste


Après un élément de la liste 1/2

Supposons que nous disposons d’une liste L et un élément elem qu’on


souhaite insérer après un élément d’adresse P.
Mémoire
P 100
20
L 20
Code en C
0
100 150 0
elem->suivant = P->suivant;
20 100 150
P->suivant = elem;
elem 46 0

46

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 16 / 37
Les listes Procédures de manipulation des listes

Insertion des éléments dans une liste


Après un élément de la liste 1/2

Supposons que nous disposons d’une liste L et un élément elem qu’on


souhaite insérer après un élément d’adresse P.
Mémoire
P 100
20
L 20
Code en C
0
100 150 0
elem->suivant = P->suivant;
20 100 150
P->suivant = elem;
elem 46 150

46

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 16 / 37
Les listes Procédures de manipulation des listes

Insertion des éléments dans une liste


Après un élément de la liste 1/2

Supposons que nous disposons d’une liste L et un élément elem qu’on


souhaite insérer après un élément d’adresse P.
Mémoire
P 100
20
L 20
Code en C
0
100 46 0
elem->suivant = P->suivant;
20 100 150
P->suivant = elem;
elem 46 150

46

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 16 / 37
Les listes Procédures de manipulation des listes

Insertion des é lé ments dans une liste


Aprè s un é lé ment de la liste 2/2

La fonction correspondante à l’insertion d’un élément elem après un


élément P de la liste L.
Insertion après un élément
void list_insert(LISTE *P, LISTE * elem){
elem->suivant = P->suivant;
P->suivant = elem;
}

...
LISTE *L = NULL, *P;
...
LISTE * elem = elem_new(10);
P = L->suivant;
list_insert(P, elem);
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps
c 2011 17 / 37
Les listes Procédures de manipulation des listes

Insertion des é lé ments dans une liste


Insertion en queue

Insertion en queue
LISTE *list_append(LISTE *L, LISTE * elem){
LISTE *cur;
if (L == NULL)
return list_push(L,elem);
cur = L;
while (cur->suivant != NULL)
cur = cur->suivant;
list_insert(cur,elem);
return L;
}

...
/* rajouter un element en queue */
L = list_append(L, elem);
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps
c 2011 18 / 37
Les listes Procédures de manipulation des listes

Exemple de cré ation d’une liste


Liste = 10, 20, 30

On souhaite créér une liste constituée des éléments {10,20,30}.


NB. L’ordre des éléments doit être respecté.
En utilisant la fonction list push
LISTE *tete = NULL;
tete = list_append(tete, elem_new(10));
tete = list_append(tete, elem_new(20));
tete = list_append(tete, elem_new(30));

En utilisant la fonction list append


LISTE *tete = NULL;
tete = list_push(tete, elem_new(30));
tete = list_push(tete, elem_new(20));
tete = list_push(tete, elem_new(10));

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 19 / 37
Les listes Variantes utiles d’une liste

Variantes utiles d’une liste

Liste circulaire

Liste doublement chaı̂née

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 20 / 37
Les Piles Définitions

Définitions

Définition
une pile (en anglais stack) est une structure de données fondée sur le
principe dernier arrivé, premier sorti (ou LIFO pour Last In, First Out),
ce qui veut dire que les derniers éléments ajoutés à la pile seront les
premiers à être récupérés. Le fonctionnement est celui d’une pile
d’assiettes : on ajoute des assiettes sur la pile, et on les récupère dans
l’ordre inverse, en commenant par la dernière ajoutée.

Push Pop

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 21 / 37
Les Piles Manipulation des Piles

Manipulation des Piles

Une pile peut être représentée (implémentée) par :


Un tableau, ou
Une liste.
Les fonctions souvent définies dans l’implémentation d’une Pile sont :
1 Est-elle vide?
2 Selon l’implémentation : est-elle pleine (tableau)?
3 Empiler un élément (En anglais, push).
4 Dépiler un élément (En anglais, pop).
5 Eventuellement, donner la valeur du premier élément.
6 Vider la pile.
NB. Les fonctions 1, 3 et 4 font partie de toute implémntation d’une pile.

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 22 / 37
Les Piles Implémentation par un tableau

Implémentation par un tableau 1/4

La pile est caractérisée par :


Un tableau (items).
Un entier (size) pour le nombre d’éléments stockés dans la pile.
Taille maximale de la pile (stacksize).

Exemple d’une pile

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 23 / 37
Les Piles Implémentation par un tableau

Implémentation par un tableau 2/4

La pile peut être implémentée par une structure à deux éléments :

#define STACKSIZE 20
typedef struct{
int size;
int items[STACKSIZE];
} STACK;

...
/* declaration d’une pile */
STACK *P1 = NULL;

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 24 / 37
Les Piles Implémentation par un tableau

Implémentation par un tableau 3/4


La fonction push (empiler)

La fonction push() est utilisée pour initialiser et stocker des valeurs dans
la pile. Elle insère la valeur à empiler dans le tableau ps→items[] et
incrémente la valeur de ps→size. Il est indispensable de s’assurer que le
tableau ps→items[] n’est pas plein avant d’empiler.
push
void push(STACK *ps, int x)
{
if (ps->size == STACKSIZE) {
fputs("Error: stack overflow\n", stderr);
abort();
} else
ps->items[ps->size++] = x;
}

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 25 / 37
Les Piles Implémentation par un tableau

Implémentation par un tableau 4/4


La fonction pop (d épiler)

La fonction pop() permet de dépiler une valeur de la pile et décrémenter


la valeur de ps → size. Lors de cette opération, l’implémentation doit
vérifier si la pile n’est pas vide avant d’exécuter une telle opération.
pop
int pop(STACK *ps)
{
if (ps->size == 0){
fputs("Error: stack underflow\n", stderr);
abort();
} else
return ps->items[--ps->size];
}

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 26 / 37
Les Piles Implémentation par une liste chaı̂née

Implémentation par une liste chaı̂ né e


Les listes chaı̂nées sont simples à implémenter.
Une liste chaı̂née simple est suffisante pour l’implémentation d’une
pile.
Une pile exige que:
l’élément situé à sa tête peut être empilé ou dépilé,
un élément insété (empilé) deviendra la nouvelle tête de la pile.
Différemment aux tableaux, la structure typedef ne correspond pas à
la pile entière, mais à un seul élément:
Structure représentant un élément de la pile
typedef struct stack {
int data;
struct stack *next;
} STACK;

La structure ci-dessous est la même que celle décrite à la page 14.


Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps
c 2011 27 / 37
Les Piles Empiler

Empiler
La fonction push() se charge de l’initialisation d’une pile vide et de l’empilement des
nouveaux éléments dans une pile non vide. Elle reçoit une valeur à empiler et une pile
cible.
Elle s’occupe de l’allocation de l’espace mémoire au nouveau élément et son insertion
dans la liste chaı̂née. L’élément inséré deviendra la nouvelle tête (head) de la pile.

void push(STACK **head, int value){


/* create a new node */
STACK *node = malloc(sizeof(STACK));
if (node == NULL){
fputs("Error: no space available for node\n", stderr);
abort();
} else {
/* initialisation */
node->data = value;
/* insertion*/
if (*head==NULL)
node->next = NULL;
else node->next = *head;
*head = node;
}
}

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 28 / 37
Les Piles Empiler

Empiler
La fonction push() se charge de l’initialisation d’une pile vide et de l’empilement des
nouveaux éléments dans une pile non vide. Elle reçoit une valeur à empiler et une pile
cible.
Elle s’occupe de l’allocation de l’espace mémoire au nouveau élément et son insertion
dans la liste chaı̂née. L’élément inséré deviendra la nouvelle tête (head) de la pile.

void push(STACK **head, int value){


/* create a new node */
STACK *node = malloc(sizeof(STACK));
if (node == NULL){
fputs("Error: no space available for node\n", stderr);
abort();
} else {
/* initialisation */
node->data = value;
/* insertion*/
if (*head==NULL)
node->next = NULL;
else node->next = *head;
*head = node;
}
}

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 28 / 37
Les Piles Empiler

Empiler
La fonction push() se charge de l’initialisation d’une pile vide et de l’empilement des
nouveaux éléments dans une pile non vide. Elle reçoit une valeur à empiler et une pile
cible.
Elle s’occupe de l’allocation de l’espace mémoire au nouveau élément et son insertion
dans la liste chaı̂née. L’élément inséré deviendra la nouvelle tête (head) de la pile.

void push(STACK **head, int value){


/* create a new node */
STACK *node = malloc(sizeof(STACK));
if (node == NULL){
fputs("Error: no space available for node\n", stderr);
abort();
} else {
/* initialisation */
node->data = value;
/* insertion*/
if (*head==NULL)
node->next = NULL;
else node->next = *head;
*head = node;
}
}

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 28 / 37
Les Piles Empiler

Empiler
La fonction push() se charge de l’initialisation d’une pile vide et de l’empilement des
nouveaux éléments dans une pile non vide. Elle reçoit une valeur à empiler et une pile
cible.
Elle s’occupe de l’allocation de l’espace mémoire au nouveau élément et son insertion
dans la liste chaı̂née. L’élément inséré deviendra la nouvelle tête (head) de la pile.

void push(STACK **head, int value){


/* create a new node */
STACK *node = malloc(sizeof(STACK));
if (node == NULL){
fputs("Error: no space available for node\n", stderr);
abort();
} else {
/* initialisation */
node->data = value;
/* insertion*/
if (*head==NULL)
node->next = NULL;
else node->next = *head;
*head = node;
}
}

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 28 / 37
Les Piles Dépiler

Dé piler
La fonction pop() élimine la tête de la liste chaı̂née, et assigne le pointeur sur la tête à
l’élément en bas de la tête. Une vérification si la liste chaı̂née est vide est effectuée
avant de dépiler:
pop

int pop(STACK **head)


{
if (*head==NULL) {/* pile est vide */
fputs("Error: stack underflow\n", stderr);
abort();
} else {/* depiler un element */
STACK *top = *head;
int value = top->data;
*head = top->next;
free(top);
return value;
}
}

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 29 / 37
Les Piles Utilisation de la pile en informatique

Utilisation de la pile en informatique

Journalisation des mises à jour pour réaliser la fonction Undo


(Annuler).
Analyse des expressions par un compilateur.
Allocation de la mémoire pour les variables locales lors de l’exécution
des procédures.
Récursivité.
...

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 30 / 37
Les Files

Définition

Définition
Une file (en anglais, queue) est une structure de données basée sur le
principe du premier entré, premier sorti, en anglais FIFO (First In, First
Out), ce qui veut dire que les premiers éléments ajoutés à la file seront les
premiers à être récupérés. Le fonctionnement ressemble à une file
d’attente : les premières personnes à arriver sont les premières personnes à
sortir de la file.

Enqueue

Dequeue

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 31 / 37
Les Files Représentation d’une file par un tableau

Repré sentation d’une file par un tableau


Comme une pile, une liste peut être représentée par un tableau ou
liste chaı̂née.
Deux indices sont utilisés pour l’implantation d’une file (début et fin)
par un tableau.
Un tableau circulaire est utilisé (la première case tu tableau fait suite
à la dernière).
Dans la suite on va donner que l’implémentation utilisant les listes
chaı̂nées.

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 32 / 37
Les Files Représentation d’une file par une liste chaı̂née

Repré sentation d’une file par une liste chaı̂ né e


Afin de représenter une file par une liste chaı̂née, nous allons besoin de
définir deux structures:
Une structure queue node qui représente un noeud (élément) de la
file.
Une structure queue qui représente la file.

Un élément de la liste (Noeud) Structure de la file (queue)


struct queue_node struct queue
{ {
struct queue_node *next; struct queue_node *first;
int data; struct queue_node *last;
}; };
first last
20 20
60

0
0

20 60
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps
c 2011 33 / 37
Les Files Ajout d’un noeud

Ajout d’un noeud


Enfiler
int enqueue(struct queue *q, const int value)
{
struct queue_node *node = malloc(sizeof(struct queue_node));
if (node == NULL) {
printf("probleme d’allocation memoire");
return 1;
}
node->data = value;
if (q->first == NULL) {
q->first = q->last = node;
} else {
q->last->next = node;
q->last = node;
}
node->next = NULL;
return 0;
}

La fonction enque() a pour but l’ajout d’un élément de valeur value à la file q.
L’ajout s’effectue du côté du noeud last (appelé aussi tête)de la file.
La fonction retourne 0 ou 1 selon la résussite ou non de l’opération d’ajout.
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps
c 2011 34 / 37
Les Files Suppression d’un noeud

Suppression d’un noeud


Défiler
int dequeue(struct queue *q, int *value)
{
if (!q->first) {/* test si la file vide */
*value = 0;
return 1;
}
/* recuperer la valeur du noeud supprimer */
*value = q->first->data;
/* recuperer l’adresse du noeud supprimer */
struct queue_node *tmp = q->first;
if (q->first == q->last) {
q->first = q->last = NULL;
} else {
q->first = q->first->next;
}
free(tmp); /* liberation de l’esapce occupe par le noeud suprime*/
return 0;
}
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps
c 2011 35 / 37
Les Files Utilisation

Utilisation

Nombreux parallèles avec le monde réel:


Queue devant un guichet (poste, banque, etc).
Avions en attente d’atterissage.
...
Utilisation en informatique:
Queue d’impression de fichiers.
scheduler: allocation du CPU à plusieurs concurrents.
Support au protocole producteur - consommateur entre deux
processus asynchrones: un processus P produit des données envoyées à
C. Une file stocke les données lorsque P produit plus vite que C ne
consomme.
...
D’une manière générale: on utilise une queue chaque fois qu’il s’agit de
gérer l’allocation d’une ressource à plusieurs clients.

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 36 / 37
Bibliographie

Bibliographie

J. Girard, Marc Roelens


Langages et concepts de programmation: structures de données et algorithmes en
C
Note de cours, ENSM- Saint-Etienne, 2010.

I. Charon, O. Hudy
Structures de données
Note de cours, ENST, 2007.

http://www.wikipedia.org/

L. Nerima
Notes de cours
Université de Genève, 2005.

D. Robaı̈ne
Notes de cours
Université du Québec.

Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de données linéaires Printemps


c 2011 37 / 37

Vous aimerez peut-être aussi