Examen 1 - Master 1 - UPMC - 2009/2010

Transcription

Examen 1 - Master 1 - UPMC - 2009/2010
Université Pierre et Marie Curie
Période 2 - 2009/2010
Master M1 "Mathématiques et Applications"
Programmation en C/C++
TD noté 1 - Structure FIFO (file d’attente)
Documents autorisés. Il faut rendre un (ou plusieurs) fichier(s) source(s) compilable(s) contenant en commentaire les noms et prénoms de tous les étudiants du groupe (binôme).
Création d’une file d’attente
Une file d’attente (ou queue) est une structure récursive (similaire en certains points à une liste chaînée) qui
satisfait à la règle FIFO (first in, first out) c’est à dire « premier entré, premier sorti ». Les deux opérations
élémentaires que l’on peut faire sur une structure FIFO est d’enfiler (enqueue, i.e. ajouter un élément a la fin
de la file d’attente) ou de défiler (dequeue, i.e. retirer le premier élément de la file d’attente).
Voici, sur un exemple, comment on représente une structure FIFO :
– la file d’attente est composée de 4 éléments dont les valeurs sont
1.5, 3.14159, 2 et 4.78,
– la file d’attente a été créée en ajoutant successivement les valeurs 1.5 puis 3.14159 puis 2 et enfin 4.78,
– l’élément de valeur 1.5 est donc le premier arrivé et il se trouve
en-tête de la file d’attente,
– l’adresse du premier élément est donnée par le pointeur front,
– on passe d’un élément à un autre en utilisant un pointeur (représenté par une flèche),
– l’adresse du dernier élément (de valeur 4.78) est donnée par le
pointeur back et il pointe sur l’adresse NULL indiquant ainsi qu’il
s’agit du dernier de la file d’attente.
front
1.5
3.14159
back
2
4.78
NULL
Une telle structure récursive peut être codé en C en utilisant le type struct element défini de la façon suivante :
2
4
struct element {
double data ;
struct element * next ;
};
Le champ data contient la valeur (ici un double) de l’élément et le champ next est un pointeur vers l’élément
suivant de la file d’attente (ou NULL si c’est le dernier élément).
1. Ecrire le type struct element dans un fichier file.h et redéfinir ce type en elt (pour faciliter l’écriture du code).
Définir (dans le fichier file.h) le type file comme une structure contenant 3 champs :
– nb_elt de type entier indiquant le nombre d’éléments dans la file d’attente (0 si file vide),
– front de type « pointeur sur elt » indiquant l’adresse du premier élément de la file (NULL si file vide),
– back de type « pointeur sur elt » indiquant l’adresse du dernier élément de la file (NULL si file vide).
Dans la suite, les propotypes des fonctions cree_file, enfile, defile, affiche et vide seront déclarés dans le
fichier file.h et les définitions de ces fonctions se feront dans le fichier file.c.
2. Définir une fonction cree_file qui crée une file d’attente vide (i.e. nb_elt = 0, front = NULL et back = NULL) et
qui renvoie l’adresse de cette file vide (un pointeur sur le type file) si la création est réussie et qui renvoie NULL
sinon. Le prototype de cree_file (à mettre dans file.h) sera donc :
file * cree_file ( void );
3. Ecrire une fonction enfile (ou enqueue) qui ajoute un élément à la fin de la file d’attente. Cette fonction doit
prendre 2 arguments (lesquels ?) et renvoyer un entier : 1 si l’ajout est réussi et 0 sinon.
Ecrire une fonction defile (ou dequeue) qui renvoie la valeur du premier élément de la file d’attente avant de le
détruire.
4. En utilisant une boucle while, écrire une fonction affiche de prototype
void affiche ( file const * f );
(en commentaire, expliquer le type de l’argument f) qui produit l’affichage suivant :
1
2
4
6
Taille de la file : 4
Contenu :
1.5
3.14159
2
4.78
5. En utilisant une boucle for, écrire une fonction vide qui détruit une file d’attente (destruction de tous les
éléments).
6. Ecrire un petit programme test.c (qui inclut le fichir d’en-tête file.h) pour tester les fonctions cree_file,
enfile, defile, affiche et vide.
Compiler et executer ce programme.
Extension
7. Ecrire une fonction fusion qui fusionne 2 files d’attente en respectant les règles suivantes :
– la première des 2 listes passées en argument contiendra la liste fusionnée,
– la fusion se fait en prenant successivement un élément de la liste 1 puis un élément de la liste 2.
Voir l’exemple ci-dessous :
Liste 1
Liste 2
front
front
1.5
back
Liste fusionnée
back
3.14159
front
2.7
1.5
150
2.7
NULL
2
3.14159
NULL
back
150
2
NULL
2