You are on page 1of 37

Les structures de donnes linaires e e

Pr. Mohamed EL ANSARI


Dpartement dInformatique e Facult des Sciences, Universit Ibn Zohr e e Agadir

melansari@gmail.com

Fili`re: SMI4 e Module: Algorithmes & Structures de donnes e

c Printemps 2011

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

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.

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

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 de donnes appartiennent le plus souvent aux familles e suivantes:


1 2 3

Les structures linaires: tableaux, listes, piles, les. e Les structures arborescentes: arbres, arbres binaires. Les structures relationnelles: graphes.

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

3 / 37

Les structures de donnes linaires e e

Les structures de donnes linaires e e

Les structures de donnes linaires sont caractrises par le fait que: e e e e


les donnes sont organises sous forme dune liste et e e les donnes sont mises les unes derri`re les autres. e e

Une liste peut tre reprsente par : e e e


1 2

un tableau unidimensionnel ou liste cha ee. n

Nature des oprations autorsies Dirents types de listes : les e e e piles, les les

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

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

Implmentation ` laide dun tableau e a

Implmentation ` laide dun tableau e a


Une liste peut tre implmente par un tableau (statique ou e e e dynamique). Implmentation simple: les lments de la liste sont rangs dans un e ee e tableau. Inconvnients: e
Linsertion dun lment: il faut dcaler dun cran tous les lments ee e ee suivants (jusqu` n+1 aectations). a La suppression dun lment peut entra ee ner jusqu` n-1 afectations. a Tableau statique:
La dimension doit tre dnie lors des dclarations et ne peut tre e e e e modie dynamiquement lors de lexcution dun programme. e e Le tableau est surdimentionn! Il encombre la mmoire de e e lordinateur.

Avantages :
Lacc`s au K`me lment est immdiat : t[k] e e ee e

Quelle implmentation? tableau ou liste cha ee? Application e n envisage. e


Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de donnes linaires e e c Printemps 2011 6 / 37

Les listes

Ralisation dune structure liste e

R alisation dune structure liste e

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 */

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

7 / 37

Les listes

Reprsentation dune liste e

Reprsentation dune liste e


NULL tte un lment de la liste information (entier, flottant, structure,...) marque la fin de la liste

adresse de l'lment suivant

Le nom de la liste. Un lment est une structure compose de : ee e

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

Cration dun lment de la liste e ee

Cr ation dun l ment de la liste e e e


Considrons la structure: e struct Element{ int val; struct Element *suivant; }; typedef struct Element LISTE; Instructions en C LISTE *liste= 0; liste =new LISTE; liste->val = 145; liste->suivant = 0;

1/2

Mmoire e
32 22
145 0

32 36

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

9 / 37

Les listes

Cration dun lment de la liste e ee

Cr ation dun l ment de la liste e e e

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); }

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

10 / 37

Les listes

Procdures de manipulation des listes e

Procdures de manipulation des listes e

Les procdures de manipulations concernent: e


1 2 3 4

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

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

11 / 37

Les listes

Procdures de manipulation des listes e

Quelques op rations utiles sur les listes e


Parcours dune liste en vue de calculer le nombre dlments qui la compose (utilisation de la ee boucle while). Taille dune liste int list_length(LISTE *L){ int len=0; while (L != NLL){ L = L->suivant; len++; } return len; } Parcours des lments dune liste an de les acher (utilisation de la boucle for). ee Impression dune 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 dacher lindice et la valeur des lments de la liste. ee
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de donnes linaires e e c Printemps 2011 12 / 37

Les listes

Procdures de manipulation des listes e

Insertion des lments dans une liste ee

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

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

13 / 37

Les listes

Procdures de manipulation des listes e

Insertion des lments dans une liste ee


En tte de la liste e 1/2

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

Code en C elem->suivant = L; L = elem;

elem

46 46

20

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

14 / 37

Les listes

Procdures de manipulation des listes e

Insertion des l ments dans une liste e e


En t te de la liste e 2/2

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));

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

15 / 37

Les listes

Procdures de manipulation des listes e

Insertion des lments dans une liste ee


Apr`s un lment de la liste e ee 1/2

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

Code en C elem->suivant = P->suivant; P->suivant = elem;

elem

46 46

150

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

16 / 37

Les listes

Procdures de manipulation des listes e

Insertion des l ments dans une liste e e


Apr` s un l ment de la liste e e e 2/2

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

Procdures de manipulation des listes e

Insertion des l ments dans une liste e e


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 donnes linaires e e c Printemps 2011 18 / 37

Les listes

Procdures de manipulation des listes e

Exemple de cr ation dune liste e


Liste = 10, 20, 30

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

Variantes utiles dune liste

Variantes utiles dune liste

Liste circulaire

Liste doublement cha ee n

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

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

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

21 / 37

Les Piles

Manipulation des Piles

Manipulation des Piles


Une pile peut tre reprsente (implmente) par : e e e e e Un tableau, ou Une liste. Les fonctions souvent dnies dans limplmentation dune Pile sont : e e
1 2 3 4 5 6

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.

NB. Les fonctions 1, 3 et 4 font partie de toute implmntation dune pile. e

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

22 / 37

Les Piles

Implmentation par un tableau e

Implmentation par un tableau e


La pile est caractrise par : e e
Un tableau (items). Un entier (size) pour le nombre dlments stocks dans la pile. ee e Taille maximale de la pile (stacksize).

1/4

Exemple dune pile

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

23 / 37

Les Piles

Implmentation par un tableau e

Implmentation par un tableau e

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;

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

24 / 37

Les Piles

Implmentation par un tableau e

Implmentation par un tableau e


La fonction push (empiler)

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; }

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

25 / 37

Les Piles

Implmentation par un tableau e

Implmentation par un tableau e


La fonction pop (d piler) e

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]; }

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

26 / 37

Les Piles

Implmentation par une liste cha ee e n

Implmentation par une liste cha n e e e


Les listes cha ees sont simples ` implmenter. n a e Une liste cha ee simple est susante pour limplmentation dune n e pile. Une pile exige que:
llment situ ` sa tte peut tre empil ou dpil, ee ea e e e e e un lment inst (empil) deviendra la nouvelle tte de la pile. ee ee e e

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; } }

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

29 / 37

Les Piles

Utilisation de la pile en informatique

Utilisation de la pile en informatique

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 ...

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires 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

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

31 / 37

Les Files

Reprsentation dune le par un tableau e

Repr sentation dune le par un tableau e


Comme une pile, une liste peut tre reprsente par un tableau ou e e e liste cha ee. n Deux indices sont utiliss pour limplantation dune le (dbut et n) e e par un tableau. Un tableau circulaire est utilis (la premi`re case tu tableau fait suite e e ` la derni`re). a e Dans la suite on va donner que limplmentation utilisant les listes e cha ees. n

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

32 / 37

Les Files

Reprsentation dune le par une liste cha ee e n

Repr sentation dune le par une liste cha n e e e


An de reprsenter une le par une liste cha ee, nous allons besoin de e n dnir deux structures: e Une structure queue node qui reprsente un noeud (lment) de la e ee le. Une structure queue qui reprsente la le. e Un lment de la liste (Noeud) ee struct queue_node { struct queue_node *next; int data; };
20

Structure de la le (queue) struct queue { struct queue_node *first; struct queue_node *last; };

last

20 60

first

0 0 20 60

Pr. Mohamed EL ANSARI (FS-Agadir)

Les structures de donnes linaires e e

c Printemps 2011

33 / 37

Les Files

Ajout dun noeud

Ajout dun noeud


Enler int enqueue(struct queue *q, const int value) { struct queue_node *node = malloc(sizeof(struct queue_node)); if (node == NULL) { printf("probleme dallocation 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 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

Suppression dun noeud

Suppression dun noeud


Dler e 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 ladresse 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 lesapce occupe par le noeud suprime*/ return 0; }
Pr. Mohamed EL ANSARI (FS-Agadir) Les structures de donnes linaires e e c Printemps 2011 35 / 37

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

You might also like