Académique Documents
Professionnel Documents
Culture Documents
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
Introduction 1/2
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.
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
NULL
NULL
tête
Le nom de la liste.
NULL
tête
un élément de la liste
Le nom de la liste.
Un élément est une structure composée de :
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);
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);
l’adresse de l’élément suivant
NULL
tête
un élément de la liste
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.
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;
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;
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;
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;
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;
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;
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;
Parcours des éléments d’une liste afin de les afficher (utilisation de la boucle for).
20
elem->suivant = L;
L = elem;
elem 46 0
46
20
elem->suivant = L;
L = elem;
elem 46 20
46
20
elem->suivant = L;
L = elem;
elem 46 20
46
...
L = list_push(L, elem_new(12));
46
46
46
...
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 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
Liste circulaire
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
#define STACKSIZE 20
typedef struct{
int size;
int items[STACKSIZE];
} STACK;
...
/* declaration d’une pile */
STACK *P1 = NULL;
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;
}
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.
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.
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.
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.
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
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
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
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
Utilisation
Bibliographie
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.