Chapitre 3 : Les piles et les files

Documents pareils
Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Génie Logiciel avec Ada. 4 février 2013

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Les structures de données. Rajae El Ouazzani

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Les arbres binaires de recherche

Algorithmique, Structures de données et langage C

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Compression de Données - Algorithme de Huffman Document de Conception

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Le prototype de la fonction main()

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Chapitre 1 : La gestion dynamique de la mémoire

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

INITIATION A LA PROGRAMMATION

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours d initiation à la programmation en C++ Johann Cuenin

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Bases de programmation. Cours 5. Structurer les données

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Travaux Dirigés n 1 : chaînes de caractères

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Programmation en langage C

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Programmation Orientée Objet Java

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

T. A. D. pile. Chapitre 7 (suite) Listes particulières. T. A. D. file. représentation chaînée de la file algorithmique. Files

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Cours Programmation Système

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

V- Manipulations de nombres en binaire

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Cours de C. Allocation dynamique. Sébastien Paumier

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Le langage C. Séance n 4

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Programmation système I Les entrées/sorties

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)


Cours d Algorithmique et de Langage C v 3.0

Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Conventions d écriture et outils de mise au point

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Evaluation et mise en place d un serveur de messages pour Chamilo 2.0

SUPPORT DE COURS. Langage C

Gestion distribuée (par sockets) de banque en Java

Arguments d un programme

Algorithmique et Programmation, IMA

Les structures. Chapitre 3

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Resolution limit in community detection

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Génération de code binaire pour application multimedia : une approche au vol

I. Introduction aux fonctions : les fonctions standards

Pensez à vous inscrire... si ce n est pas encore fait

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Cours 6 : Tubes anonymes et nommés

Chap III : Les tableaux

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Programmation C++ (débutant)/instructions for, while et do...while

Introduction à la programmation concurrente

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Architecture des ordinateurs

Cours de Programmation 2

3IS - Système d'exploitation linux - Programmation système

Programmation Classique en langage C

Plateforme PAYZEN. Définition de Web-services

Définition des Webservices Ordre de paiement par . Version 1.0

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Programmation impérative

Structure fonctionnelle d un SGBD

MINIMUM. connaissances nécessaires à la programmation des microcontrôleurs PIC18 en langage C (une introduction au langage c A.N.S.

Arbres binaires de recherche

OS Réseaux et Programmation Système - C5

Initiation. àl algorithmique et à la programmation. en C

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

COURS D'INFORMATIQUE: LANGAGE C NOTES DE COURS

Analyse de sécurité de logiciels système par typage statique

Représentation d un entier en base b

et Programmation Objet

Les processus légers : threads. Système L3, /31

INFO-F-105 Language de programmation I Séance VI

Initiation à la Programmation en Logique avec SISCtus Prolog

REALISATION d'un. ORDONNANCEUR à ECHEANCES

BTS IRIS Cours et Travaux Pratiques. Programmation C. A. Lebret, TSIRIS, Lycée Diderot, 1995/06. en conformité avec le référentiel du BTS IRIS

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Transcription:

Chapitre 3 : et les files Université Mohamed 1er Faculté des sciences Oujda FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 1 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 2 Définition : Une pile (stack) est une structure de données linéaire dans laquelle les opérations d insertion et de suppression sont réalisées à une extrémité fixée de la liste, appelée «sommet de la pile». Dans une pile, le dernier élément entré (inséré) est le premier sorti (supprimé). Le terme «Last In, First Out» ou LIFO indique cette stratégie utilisée avec une pile. Insertion dans une pile : L opération «insérer» dans une pile est souvent appelée «empiler» (push). Suppression dans une pile : L opération «supprimer» dans une pile est souvent appelée «dépiler» (pop). Sommet de la pile : L opération «retourner sommet» dans une pile est souvent appelée «sommet» (top). FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 3 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 4 Applications des piles : Utilisées par les compilateurs pour vérifier le bon parenthésage. Utilisées pour évaluer une expression postfixée. Utilisées pour convertir une expression infixée en une expression postfixée/préfixée. Dans une procédure ou une fonction récursive, tous les arguments intermédiaires et toutes les valeurs de retour sont stockées dans une pile. Durant l appel d une fonction, les arguments et les adresses de retour sont empilées dans la pile et dépilées de cette pile après une instruction «return». Opération «empiler» : Pile vide Empiler 11 Empiler 22 Empiler 33 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 5 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 6 1

Opération «dépiler» : Pile initiale Dépiler Dépiler Dépiler Pile vide Représentation contiguë avec un tableau (exemple : une pile d entiers) : #define STACKSIZE 100 typedef struct StackType int stack[stacksize]; int stackpointer; // initialisé à 0 StackType; int isempty(stacktype P) return P.stackPointer == 0; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 7 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 8 Représentation contiguë avec un tableau (suite): int isfull(stacktype P) return P.stackPointer == STACKSIZE - 1; void push(stacktype P, int x) if(isfull(p)) printf("error : the stack is full!!!"); P.stack[stackPointer++] = x; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 9 Représentation contiguë avec un tableau (suite): void pop(stacktype P) if(isempty(p)) printf("error : the stack is empty!!!"); stackpointer--; void top(stacktype P) if(isempty(p)) printf("error : the stack is empty!!!"); return 0; return stack[stackpointer - 1]; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 10 Représentation contiguë avec un tableau (suite): main( ) StackType P; push(p, 2); push(p, 3); push(p, 5); push(p, 7); printf("%d\n", top(p)); pop(p); printf("%d\n", top(p)); 7 5 3 2 stack stackpointer stackpointer stackpointer stackpointer stackpointer Représentation non contiguë (exemple : une pile d entiers) : typedef struct Node int data; struct Node *next; Node; typedef Node *stack; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 11 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 12 2

Représentation non contiguë (suite) : int isempty(stack P) return P == NULL; void push(stack *P, int x) Node *newnode = (Node*) malloc(sizeof(node)); newnode->data = x; newnode->next = *P; *P = newnode; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 13 Représentation non contiguë (suite) : void pop(stack *P) if(isempty(*p)) printf("error : the stack is empty\n"); Node *temp = *P; *P = (*P)->next; free(temp); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 14 Représentation non contiguë (suite) : int top(stack P) if(isempty(p)) printf("error : the stack is empty\n"); return 0; return P->data; Représentation non contiguë (suite) : main( ) stack P; push(&p, 2); push(&p, 3); push(&p, 5); push(&p, 7); printf("%d\n", top(p)); pop(&p); printf("%d\n", top(p)); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 15 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 16 Définition : Une file (queue) est une structure de données linéaire dans laquelle l opération d insertion est réalisée à une extrémité de la liste (la queue), et l opération de suppression est réalisée à l autre extrémité de la liste (la tête). Dans une file, le premier élément entré (inséré) est le premier sorti (supprimé). Le terme «First In, First Out» ou FIFO indique cette stratégie utilisée avec une file. FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 17 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 18 3

Insertion dans une file : L opération «insérer» dans une file est souvent appelée «enfiler» (enqueue). Suppression dans une pile : L opération «supprimer» dans une file est souvent appelée «défiler» (dequeue). Considérons une file qui peut contenir au maximum 5 éléments. La queue est repérée par un pointeur appelé «Rear» (= en arrière). La tête est repérée par un pointeur appelé «Front» (= en avant). FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 19 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 20 Initialement, la file est vide : Maintenant, insérons 11 (en queue) : File vide F(Front) = 0 R(Rear) = 0 Front = 0 Rear = Rear + 1 = 1 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 21 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 22 Ensuite, insérons 22 à la file : Encore une fois, insérons l élément 33 à la file. Front = 0 Rear = Rear + 1 = 2 Front = 0 Rear = Rear + 1 = 3 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 23 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 24 4

Maintenant, retirons un élément de la file. L élément à retiré est l élément qui se trouve en tête de la file (Front). L état de la file sera alors : Retirons encore un élément de la file. L élément à retiré est l élément qui se trouve en tête de la file (l élément 22) : Front = Front + 1 = 1 Rear = 3 Front = Front + 1 = 2 Rear = 3 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 25 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 26 Maintenant, insérons les éléments 44 et 55 : Front = 2 Rear = 5 Maintenant, il est impossible d insérer un élément 66 même s il y a deux positions vacantes en tête de la file. Pour régler ce problème, on peut décaler les éléments de la file en tête (Front) de celle-ci pour créer des positions vacantes en queue de la file : les valeurs de Front et Rear doivent être ajustées correctement. L élément 66 peut maintenant être inséré en queue. FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 27 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 28 Représentation d une file par un tableau : # include <stdio.h> Front = 0 Rear = 4 # define SIZE 5 typedef struct File int contenu[size]; int tete, queue; /* Front et Rear */ File; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 29 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 30 5

Opérations (sans ajustement des positions void initialiser(file* F) F->tete = F->queue = 0; int estvide(file F) return (F.queue== 0); Opérations (sans ajustement des positions int estpleine(file F) return (F.queue == SIZE); void enfiler(file* F, int x) if(estpleine(*f)) printf("\n\n Erreur : la file est vide!!!"); F->contenu[F->queue++] = x; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 31 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 32 Opérations (sans ajustement des positions void defiler(file* F) if(estvide(*f)) printf("\n\n Erreur : la file est vide!!!"); F->tete++; Opérations (sans ajustement des positions void afficher(file F) if(!estvide(f)) int i; for(i = F.tete; i < F.queue; i++) printf("%d ", F.contenu[i]); puts(""); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 33 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 34 Opérations (sans ajustement des positions main ( ) File F; initialiser(&f); enfiler(&f, 11); afficher(f); enfiler(&f, 22); afficher(f); enfiler(&f, 33); afficher(f); defiler(&f); afficher(f); defiler(&f); afficher(f); enfiler(&f, 44); afficher(f); enfiler(&f, 55); afficher(f); enfiler(&f, 66); afficher(f); system("pause"); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 35 Solution par décalage à gauche : Tous les éléments reculent d une place lorsque le premier est servi (supprimé). Le pointeur de tête (Front) est alors inutile, puisqu il est toujours égal à 0. Par conséquent, la file est gérée par un tableau et un seul pointeur (Rear) et lorsqu un élément est supprimé, les autres éléments restants sont décalés à gauche et la valeur de «Rear» est décrémentée. FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 36 6

Solution par décalage à gauche : # include <stdio.h> # define SIZE 5 typedef struct File int contenu[size]; int queue; /* Pas besoin de Front (tete) */ File; Solution par décalage à gauche : void initialiser(file* F) F->queue = 0; int estvide(file F) return (F.queue == 0); int estpleine(file F) return (F.queue == SIZE); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 37 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 38 Solution par décalage à gauche : void enfiler(file* F, int x) if(estpleine(*f)) printf("file pleine : "); printf("impossible d'enfiler %d\n", x); F->contenu[F->queue++] = x; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 39 Solution par décalage à gauche void defiler(file* F) if(estvide(*f)) printf("file vide : impossible de defiler la file\n"); int i; /* décalage des éléments restants vers la tête */ for(i = 0; i < F->queue - 1; i++) F->contenu[i] = F->contenu[i + 1]; F->queue--; /* reculer la queue */ FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 40 Solution par décalage à gauche : void afficher(file* F) if(!estvide(f)) int i; for(i = 0; i < F.queue; i++) printf("%d ", F.contenu[i]); puts(""); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 41 Solution par tableau «circulaire» : Efficace : car elle minimise la place nécessaire dans le tableau, tout en évitant les opérations de décalage. Lorsque la tête (Front) devient égale à la queue (Rear) (modulo N), la file est soit vide, soit pleine. On est donc amené à distinguer les 2 possibilités en utilisant deux indicateurs booléens «vide» et «pleine». FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 42 7

Au départ la file est vide : pleine := 0 et vide := 1 La procédure «enfiler(x)» : Si la file est pleine : impossible d enfiler x. Sinon (la file n est pas pleine), il y a deux cas : Si queue < N, alors on enfile x dans la case queue, et l on incrémente queue. Si queue = N, alors on enfile x dans la case 0, et l on incrémente queue. On peut regrouper les deux cas en un seul : queue := queue % N; On enfile x dans la case queue, et l on incrémente queue. La file est certainement non vide : vide := 0 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 43 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 44 Finalement, on teste si la file est pleine : pliene := (queue < N et tete == queue) ou (queue = N et tete = 0) La procédure «défiler()» : Si la file est vide : impossible d enfiler x. Sinon (la file n est pas vide), il y a deux cas : Si tete < N, alors on l on incrémente. Si tete = N, alors tete := 1. On peut regrouper les deux cas en un seul : tete := tete % N; on incrémente tete FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 45 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 46 La file est certainement non pleine : pleine := 0 On teste si la file est vide : vide := (tete < N et tete == queue) ou (tete = N et queue = 0) #include <stdio.h> #define SIZE 5 typedef struct File int contenu[size]; int tete, queue; int vide, pleine; File; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 47 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 48 8

void initialiser(file* F) F->tete = F->queue = 0; F->vide = 1; F->pleine = 0; int estvide(file F) return F.vide; int isfull(file F) return F.pleine; void enfiler(file* F, int x) if(estpleine(*f)) printf("erreur : la file est pleine!!!\n"); F->queue = F->queue % SIZE; F->contenu[F->queue++] = x; F->vide = 0; F->pleine = (F->tete == 0 && F->queue == SIZE) (F->queue < SIZE && F->tete == F->queue); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 49 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 50 void defiler(file* F) if(estvide(*f)) printf("erreur : la file est vide!!!\n"); F->tete = F->tete % SIZE; F->tete++; F->pleine = 0; F->vide = (F->tete == SIZE && F->queue == 0) (F->tete < SIZE && F->tete == F->queue); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 51 void afficher(file F) int i; if(estvide(f)) printf("la file est vide\n"); if(f.tete < F.queue) for(i = F.tete; i < F.queue; i++) FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 52 printf("%d ", F.contenu[i]); puts(""); if(f.tete >= F.queue) for(i = F.tete; i < SIZE; i++) printf("%d ", F.contenu[i]); for(i = 0; i < F.queue; i++) printf("%d ", F.contenu[i]); puts(""); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 53 C est une représentation classique de liste chaînée, dans laquelle on utilise un pointeur supplémentaire : le pointeur vers la dernière cellule, ce qui permet d accélérer l algorithme d insertion à la fin de la liste. Front Rear FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 54 9

# include <stdio.h> # include <stdlib.h> typedef struct Noeud int info; struct Noeud* suiv; Noeud; typedef struct File Noeud* tete; Noeud* queue; File; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 55 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 56 void initialiser(file* F) F->tete = NULL; F->queue = NULL; int estvide(file F) return F.tete == NULL; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 57 void enfiler(file* F, int x) Noeud* temp = (Noeud*) malloc(sizeof(noeud)); if(temp == NULL) printf("erreur : impossible d'enfiler %d\n", x); temp->info = x; temp->suiv = NULL; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 58 if(estvide(*f)) F->tete = F->queue = temp; F->queue->suiv = temp; F->queue = temp; printf("l'element %d est enfile\n", x); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 59 void defiler(file* F) if(estvide(*f)) printf("erreur : la file est vide!!!\n"); Noeud* temp = F->tete; printf("l'element %d est defile\n", temp->info); F->tete = F->tete->suiv; free(temp); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 60 10

void afficher(file F) Noeud* temp; temp = F.tete; while(temp!= NULL) printf("%d ", temp->info); temp = temp->suiv; puts(""); Représentation d une file par une liste circulaire: Dans ce cas, la file sera représentée par un pointeur vers la dernière cellule. Rear FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 61 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 62 Représentation d une file par une liste circulaire: #include <stdio.h> #include <stdlib.h> typedef struct Noeud int info; struct Noeud* suiv; Noeud; typedef Noeud* File; Représentation d une file par une liste circulaire: void initialiser(file* F) *F = NULL; int estvide(file F) return F == NULL; FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 63 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 64 Représentation d une file par une liste circulaire: void enfiler(file* F, int x) Noeud* temp = (Noeud*) malloc(sizeof(noeud)); temp->info = x; if(estvide(*f)) *F = temp; temp->suiv = temp; temp->suiv = (*F)->suiv; (*F)->suiv = temp; *F = temp; Représentation d une file par une liste circulaire: void defiler(file* F) if(estvide(*f)) printf("erreur : la file est vide!!!\n"); if((*f)->suiv == *F) free(*f); initialiser(f); Noeud* temp = (*F)->suiv; (*F)->suiv = temp->suiv; free(temp); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 65 FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 66 11

Représentation d une file par une liste circulaire: void afficher(file F) if(estvide(f)) puts("file vide"); Noeud* temp = F->suiv; while(temp!= F) printf("%d ", temp->info); temp = temp->suiv; printf("%d\n", temp->info); FSO, Filière SMI-S4, Printemps 2017 Prof. Abdelmajid DARGHAM 67 12