Professional Documents
Culture Documents
melansari@gmail.com
c Printemps 2011
c Printemps 2011
1 / 37
Introduction
Introduction
Probl`me : Donnes Algorithme Solution e e Les structures de donnes spcient la faon de reprsenter les e e c e donnes dun probl`me. e e Le choix dune telle structure doit tenir compte de:
1 2
1/2
La place mmoire consomme par la structure. e e La facilit quelle ore pour accder ` une certaine donne. e e a e
Les structures de donnes sont dnies indpendamment du langage e e e de programmation. Direntes faon dattribution et dutilisation de la mmoire: e c e
1 2 3
Variables isoles les unes des autres dans la mmoire. e e Tableaux. Pointeurs.
c Printemps 2011
2 / 37
Introduction
Introduction
2/2
Attribution mmoire: e
1
Par le compilateur et ne peut pas tre modie au cours du programme e e (variables statiques). Eectue pendant le droulement du programme et peut donc varier e e pendant celui-ci (varaibles dynamiques).
Les structures linaires: tableaux, listes, piles, les. e Les structures arborescentes: arbres, arbres binaires. Les structures relationnelles: graphes.
c Printemps 2011
3 / 37
Nature des oprations autorsies Dirents types de listes : les e e e piles, les les
c Printemps 2011
4 / 37
Les listes
Les listes
Une liste est une suite dlments dun type donn. Elle peut contenir ee e zro, un ou plusieurs lments. e ee Exemples :
1 2
(3, 7, 2, 8, 10, 4) est une liste dentiers. (lundi, mardi, mecredi, jeudi, vendredi, samedi, dimanche) est la liste des jours de la semaine.
Une liste (ou liste cha ee) est une structure de donnes constitue n e e dlments contenant chacun : ee
1
des donnes utiles ou une rfrence (adresse, ou pointeur) sur des e ee donnes utiles; e une rfrence (adresse, ou pointeur) de llment suivant. ee ee
La liste est dtermine par la rfrence (adresse) de son premier e e ee lment (nomm souvent tte de la lsite). ee e e Le dernier lment de la liste pointe sur une adresse qui ne peut ee contenir aucune donne utile (ladresse NULL en langage C). e
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de donnes linaires e e c Printemps 2011 5 / 37
Les listes
Avantages :
Lacc`s au K`me lment est immdiat : t[k] e e ee e
Les listes
Supposons que nous souhaitons crr une liste dentiers, le type ee structur permettant de construire ladite liste est dnie comme suit: e e Un lment dune liste dentiers ee struct Element{ int val; struct Element *suivant; }; La dclaration dune liste nomme tete seectue de la fan suivante: e e o Dclaration dune liste e struct Element * tete = NULL; /* liste vide */
c Printemps 2011
7 / 37
Les listes
linformation utile (type prdnie ou dnie par le programmeur); e e e ladresse de llment suivant ee
En langage C, NULL est utilis pour marquer la n de la liste. e
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de donnes linaires e e c Printemps 2011 8 / 37
Les listes
1/2
Mmoire e
32 22
145 0
32 36
c Printemps 2011
9 / 37
Les listes
2/2
On peut dnir une fonction qui se charge de la crtaion dun lment (appel aussi maillon). e e ee e Llment pourra par la suite rajout ` une liste. ee ea Cration dun maillon e 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 libration de lespace allou ` un lment: e ea ee Libration dun maillon e void * elem_free(LISTE *elem) { free(elem); }
c Printemps 2011
10 / 37
Les listes
linitialisation dune liste (en gnral, liste vide); e e tester si une liste est vide; passage ` llment suivant dune liste; a ee lajout dun lment dans une liste, au dbut, ` la n, ou entre deux ee e a lments; ee la suppression dun lment dune liste; ee le parcours de la liste; concatnation de deux listes contenant des lments du mme type; e ee e ...
5 6 7 8
c Printemps 2011
11 / 37
Les listes
Les listes
Au moment de sa cration, une liste doit tre initialise. En gnral, e e e e e on lui aecte la valeur NULL. Une fois un lment est cr, son insertion peut tre eectu soit : ee ee e e
au dbut de la liste (tte), direcetement accessible au travers du e e pointeur reprsentant la liste, ou e ` la position n de la liste, ncessite de parcourir les n-1 premiers a e lments de la liste. ee
c Printemps 2011
13 / 37
Les listes
Supposons que nous disposons dune liste L et un lment elem quon ee souhaite insrer ` la tte de L. e a e Mmoire e
L
46 20 0 0 20
elem
46 46
20
c Printemps 2011
14 / 37
Les listes
On peut crire les instructions dinsertion en tte sous forme dune e e fonction. Insrer un lment en tte e ee e LISTE * list_push(LISTE *L, LISTE * elem){ elem->suivant = L; return elem; } ... L = list_push(L, elem_new(12));
c Printemps 2011
15 / 37
Les listes
Supposons que nous disposons dune liste L et un lment elem quon ee souhaite insrer apr`s un lment dadresse P. e e ee Mmoire e
L
20
100 20
100 20 100
46 150
0 0
elem
46 46
150
c Printemps 2011
16 / 37
Les listes
La fonction correspondante ` linsertion dun lment elem apr`s un a ee e lment P de la liste L. ee Insertion apr`s un lment e ee 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 donnes linaires e e c Printemps 2011 17 / 37
Les 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 donnes linaires e e c Printemps 2011 18 / 37
Les listes
On souhaite crr une liste constitue des lments {10,20,30}. ee e ee NB. Lordre des lments doit tre respect. ee e e 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 donnes linaires e e c Printemps 2011 19 / 37
Les listes
Liste circulaire
c Printemps 2011
20 / 37
Les Piles
Dnitions e
Dnitions e
Dnition e une pile (en anglais stack) est une structure de donnes fonde sur le e e principe dernier arriv, premier sorti (ou LIFO pour Last In, First Out), e ce qui veut dire que les derniers lments ajouts ` la pile seront les ee e a premiers ` tre rcuprs. Le fonctionnement est celui dune pile ae e ee dassiettes : on ajoute des assiettes sur la pile, et on les rcup`re dans e e lordre inverse, en commenant par la derni`re ajoute. e e
Push Pop
c Printemps 2011
21 / 37
Les Piles
Est-elle vide? Selon limplmentation : est-elle pleine (tableau)? e Empiler un lment (En anglais, push). ee Dpiler un lment (En anglais, pop). e ee Eventuellement, donner la valeur du premier lment. ee Vider la pile.
c Printemps 2011
22 / 37
Les Piles
1/4
c Printemps 2011
23 / 37
Les Piles
2/4
La pile peut tre implmente par une structure ` deux lments : e e e a ee #define STACKSIZE 20 typedef struct{ int size; int items[STACKSIZE]; } STACK; ... /* declaration dune pile */ STACK *P1 = NULL;
c Printemps 2011
24 / 37
Les Piles
3/4
La fonction push() est utilise pour initialiser et stocker des valeurs dans e la pile. Elle ins`re la valeur ` empiler dans le tableau psitems[] et e a incrmente la valeur de pssize. Il est indispensable de sassurer que le e tableau psitems[] nest pas plein avant dempiler. push void push(STACK *ps, int x) { if (ps->size == STACKSIZE) { fputs("Error: stack overflow\n", stderr); abort(); } else ps->items[ps->size++] = x; }
c Printemps 2011
25 / 37
Les Piles
4/4
La fonction pop() permet de dpiler une valeur de la pile et dcrmenter e e e la valeur de ps size. Lors de cette opration, limplmentation doit e e vrier si la pile nest pas vide avant dexcuter une telle opration. e e e pop int pop(STACK *ps) { if (ps->size == 0){ fputs("Error: stack underflow\n", stderr); abort(); } else return ps->items[--ps->size]; }
c Printemps 2011
26 / 37
Les Piles
Diremment aux tableaux, la structure typedef ne correspond pas ` e a la pile enti`re, mais ` un seul lment: e a ee Structure reprsentant un lment de la pile e ee typedef struct stack { int data; struct stack *next; } STACK; La structure ci-dessous est la mme que celle dcrite ` la page 9. e e a
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de donnes linaires e e c Printemps 2011 27 / 37
Les Piles
Empiler
Empiler
La fonction push() se charge de linitialisation dune pile vide et de lempilement des nouveaux lments dans une pile non vide. Elle reoit une valeur ` empiler et une pile ee c a cible. Elle soccupe de lallocation de lespace mmoire au nouveau lment et son insertion e ee dans la liste cha ee. Llment insr deviendra la nouvelle tte (head) de la pile. n ee ee e 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 donnes linaires e e c Printemps 2011 28 / 37
Les Piles
Dpiler e
D piler e
La fonction pop() limine la tte de la liste cha ee, et assigne le pointeur sur la tte ` e e n e a llment en bas de la tte. Une vrication si la liste cha ee est vide est eectue ee e e n e avant de dpiler: e 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; } }
c Printemps 2011
29 / 37
Les Piles
Journalisation des mises ` jour pour raliser la fonction Undo a e (Annuler). Analyse des expressions par un compilateur. Allocation de la mmoire pour les variables locales lors de lexcution e e des procdures. e Rcursivit. e e ...
c Printemps 2011
30 / 37
Les Files
Dnition e
Dnition e Une le (en anglais, queue) est une structure de donnes base sur le e e principe du premier entr, premier sorti, en anglais FIFO (First In, First e Out), ce qui veut dire que les premiers lments ajouts ` la le seront les ee e a premiers ` tre rcuprs. Le fonctionnement ressemble ` une le ae e ee a dattente : les premi`res personnes ` arriver sont les premi`res personnes ` e a e a sortir de la le.
Enqueue
Dequeue
c Printemps 2011
31 / 37
Les Files
c Printemps 2011
32 / 37
Les Files
Structure de la le (queue) struct queue { struct queue_node *first; struct queue_node *last; };
last
20 60
first
0 0 20 60
c Printemps 2011
33 / 37
Les Files
La fonction enque() a pour but lajout dun lment de valeur value ` la le q. ee a Lajout seectue du ct du noeud last (appel aussi tte)de la le. oe e e La fonction retourne 0 ou 1 selon la rsussite ou non de lopration dajout. e e
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de donnes linaires e e c Printemps 2011 34 / 37
Les Files
Les Files
Utilisation
Utilisation
Nombreux parall`les avec le monde rel: e e
Queue devant un guichet (poste, banque, etc). Avions en attente datterissage. ...
Utilisation en informatique:
Queue dimpression de chiers. scheduler: allocation du CPU ` plusieurs concurrents. a Support au protocole producteur - consommateur entre deux processus asynchrones: un processus P produit des donnes envoyes ` e e a C. Une le stocke les donnes lorsque P produit plus vite que C ne e consomme. ...
Dune mani`re gnrale: on utilise une queue chaque fois quil sagit de e e e grer lallocation dune ressource ` plusieurs clients. e a
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de donnes linaires e e c Printemps 2011 36 / 37
Bibliographie
Bibliographie
J. Girard, Marc Roelens Langages et concepts de programmation: structures de donnes et algorithmes en e C Note de cours, ENSM- Saint-Etienne, 2010. I. Charon, O. Hudy Structures de donnes e Note de cours, ENST, 2007. http://www.wikipedia.org/ L. Nerima Notes de cours Universit de Gen`ve, 2005. e e D. Roba ne Notes de cours Universit du Qubec. e e
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de donnes linaires e e c Printemps 2011 37 / 37