3I-IN9 Structures de donn´ees
Structures de donn´ ees
TP2
Introduction
Dans la suite des TPs de structure de donn´ees, vous allez d´evelopper une biblioth`eque en C dans la quelle vous impl´ementerez :
— des structures de donn´ees :
— Tableau dynamique
— Liste doublement chaˆın´ee
— Pile et File
— ...
— des fonctions pour mesurer les performances de vos structures de donn´ees :
— Mesure du temps d’ex´ecution
— Mesure du nombre d’allocations m´emoire
— Mesure de la quantit´e de m´emoire allou´ee
Vous allez ´egalement d´evelopper des codes de test bas´es sur plusieurs algorithmes de tri pour
´
evaluer les performances de vos impl´ementations.
Et vous devez ´ecrire le makefile pour la compilation automatique de votre projet.
1 Travaux pr´ ealable
1.1. Cr´eez votre r´epertoire de travail, nommez le i3 in9 lib.
1.2. Dans votre r´epertoire de travail, cr´eez un fichier nomm´eREADME. Dans ce fichier, indiquez vos noms et pr´enoms.
1.3. Dans votre r´epertoire de travail, cr´eez un fichier nomm´e makefile. Vous le laisserez vide pour le moment.
2 Tableau dynamique
Dans ce TP, vous allez d´evelopper un tableau dynamique. C’est une structure de donn´ees qui permet :
— de stocker un ensemble de n donn´ees ;
— d’acc´eder aux donn´ees par un index ;
— d’ajouter et de supprimer dynamiquement des donn´ees.
Classe C++ : Vector
Pour d´evelopper votre structure de tableau dynamique, vous allez vous inspirer de la classe C++Vector(documentationici). Les principales fonctions de la classe Vector que nous voulons reproduire sont :
— vector::at
— vector::erase
— vector::insert
IN3I21 Romain Negrel Page 1 sur 3
— vector::push back
— vector::pop back
— vector::clear
— vector::empty
— vector::size
— vector::capacity
Pour ´eviter d’effectuer trop souvent des allocations m´emoire lors des insertions et de suppres- sions de donn´ees dans le tableau, la classe C++ Vector utilise un strat´egie d’anticipation en allouent `a l’avance plus de m´emoire que n´ecessaire. Vous aller impl´ementer un m´ecanise similaire dans votre structure de tableau dynamique.
2.1 Tableau dynamique de double
Dans une premier temps, vous allez d´evelopper une structure de tableau dynamique simple (sans m´ecanisme pour r´eduire le nombre d’allocation m´emoire) pour stocker des doubleet vous ne vous soucierez pas pour le moment de la librations de la m´emoire des donn´ees stock´ees.
2.1. Cr´eez dans votre r´epertoire de travail les fichiers
— vector.h;
— vector.c.
(a) Ajoutez dans le fichier vector.h, les instruction de pr´ecompilation pour s´ecuriser votre fichier contre les doubles inclusions.
(b) Ajoutez dans le fichier makefile, les lignes pour compiler le fichier vector.c et obtenir le fichier vector.o.
(c) Testez en ex´ecutant la commande make vector.o dans votre r´epertoire de travail.
2.2. Structure pour votre tableau dynamique.
(a) D´eclarez dans le fichiervector.hune structure, que vous nommerezstruct vectoret qui contient :
— Une variable pour stocker le nombre d’´el´ement stocker dans la structure
— Un pointeur de double.
(b) Utilisez la commende C typedef (doc. ici) pour red´efinir votre struct struct_vector en
s_vectoret pour d´efinir le typep_s_vector qui est un pointeur sur la structure des_vector
.
2.3. Fonctions pour votre tableau dynamique.
(a) ´Ecrivez la fonction p_s_vector vector_alloc(size_t n);qui alloue et retourne votre struc- ture. Le tableau dynamique contient n double pr`es initialis´es `a 0.0.
(b) ´Ecrivez la fonction void vector_free(p_s_vector p_vector); qui lib`ere votre structure.
(c) ´Ecrivez la fonctionvoid vector_set(p_s_vector p_vector, size_t i, double v);qui affecte la valeur v `a l’index i de votre tableau dynamique et la fonction double vector_get(
p_s_vector p_vector, size_t i);qui retourne la valeur de l’index i.
Ces fonctions sont les ´equivalents de la m´ethode vector::at de la classe C++Vector.
(d) ´Ecrivez la fonction void vector_insert(p_s_vector p_vector, size_t i, double v); qui in- sert une nouvelle donn´ee `a l’indexi de votre tableau dynamique.
Cette fonction est l’´equivalent de la m´ethode vector::insertde la classe C++ Vector.
IN3I21 Romain Negrel Page 2 sur 3
(e) ´Ecrivez la fonction void vector_erase(p_s_vector p_vector, size_t i); qui supprime la donn´ee `a l’index i de votre tableau dynamique.
Cette fonction est l’´equivalent de la m´ethode vector::erase de la classe C++ Vector.
(f) ´Ecrivez la fonction void vector_push_back(p_s_vector p_vector, double v); qui insert une nouvelle donn´ee `a la fin de votre tableau dynamique.
Cette fonction est l’´equivalent de la m´ethode vector::push back de la classe C++
Vector.
(g) ´Ecrivez la fonction void vector_pop_back(p_s_vector p_vector); qui supprime la derni`ere donn´ee de votre tableau dynamique.
Cette fonction est l’´equivalent de la m´ethodevector::pop backde la classe C++Vector.
(h) ´Ecrivez la fonctionvoid vector_clear(p_s_vector p_vector);qui supprime toutes les donn´ees de votre tableau dynamique.
Cette fonction est l’´equivalent de la m´ethode vector::clear de la classe C++ Vector.
(i) ´Ecrivez la fonctionint vector_empty(p_s_vector p_vector);qui retourne un entier non-nul si votre tableau dynamique est vide et z´eros sinon.
Cette fonction est l’´equivalent de la m´ethode vector::empty de la classe C++ Vector.
(j) ´Ecrivez la fonctionsize_t vector_size(p_s_vector p_vector);qui retourne le nombre d’´el´ement stocker dans le tableau dynamique
Cette fonction est l’´equivalent de la m´ethode vector::size de la classe C++Vector.
2.4. Fichier de test
(a) Cr´eez le fichier test vector.c .
(b) Ajoutez dans ce fichier le code minimum pour la fonction int main(int argc, char *argv []).
(c) Ajoutez dans le fichiermakefile, les lignes pour compiler le fichiertest vector.cet obtenir le fichier test vector.o
(d) Testez en ex´ecutant la commande make test vector.o dans votre r´epertoire de travail.
(e) Ajoutez dans le fichiermakefile, les lignes pour effectuer le linkage detest vector.oet
vector.o et obtenir le fichier test vector
(f) Testez en ex´ecutant la commande make test vector dans votre r´epertoire de travail.
(g) Dans le fichiertest vector.c´ecrivez des fonctions de teste unitaire pour tester toute vos fonctions de votre vecteur.
IN3I21 Romain Negrel Page 3 sur 3