suite de tp1 et projet

publicité
Institut National des Postes et Télécommunications
2012-2013
Structures de données & analyse des algorithmes
TP1
Introduction
L’objectif de ce premier TP est de vous familiariser avec les structures de données liste, file, pile et
arbre binaire tout en utilisant le langage orienté objet C++. Pour ce faire, on vous demande d’abord
d’étudier et réaliser les exemples de C++ disponibles sur la page web http://3w.inpt.ac.ma/~poo
Description
Les listes, les files, les piles et les arbres binaires sont des structures de données très utilisées dans
le développement logiciel avec des applications diverses telles que les simulateurs de réseaux, les
systèmes d’exploitation, les systèmes de gestion des bases de données, les applications métiers, etc.
Une liste permet, au même titre qu’un tableau par exemple, de garder en mémoire des données en
respectant un certain ordre et d’en faire des traitements (ajouter, enlever, consulter …). Une file est
conçue comme étant une collection d’éléments organisée de telle sorte que l’ajout des éléments se
fait toujours à la fin de l’ensemble liste tandis que le retrait (la suppression) des éléments s’effectue
toujours à partir du début de la collection. Elle peut être implémentée en C++ par une liste chainée
où les éléments sont donnés sous formes de nœuds connectés entre eux à l’aide des pointeurs. Dans
sa forme basique, un nœud est généralement formé de deux champs : une information d’un certain
type et un pointeur vers le nœud suivant. Une pile est similaire à une file sauf que l’ajout et la
suppression des éléments se font de la même extrémité. Un arbre binaire, tel qu’il est vu dans le
cours, est une structure de données consistant en une collection de nœuds reliés entre eux par la
relation père/fils. Un arbre binaire a un seul nœud racine (n’ayant pas de parent) qui sert d’accès à
l’ensemble de l’arbre, un ou plusieurs nœuds feuille et un ou plusieurs nœuds internes. Dans un
arbre binaire, un nœud est formé de trois compartiments pour contenir une information de
quelconque type, un pointeur vers le fils gauche et un pointeur vers le fils droit. Un nœud d’un arbre
binaire est dit feuille si son fils gauche et son fils droit sont nuls ; par contre, un nœud est qualifié
de nœud interne si au moins un des ses fils (gauche ou droit) est non nul. Parmi les types d’arbres
binaires les plus utilisés, on trouve les arbres binaires de recherche et les tas («heap» en anglais) qui
peuvent être définis comme suit. Un arbre binaire de recherche (BST : Binary Research Tree) est un
arbre binaire dans lequel l’information contenue dans chaque nœud est supérieure à toutes les
informations contenues dans son sous-arbre gauche et est inférieure à toutes les informations
stockées dans son sous-arbre droit (voir les notes de cours SVP). Un tas («heap» en anglais), quant
à lui, est un arbre binaire complet dont les éléments sont partiellement ordonnés (contrairement à un
ordre total pour un BST) : Il existe une relation d’ordre entre l’information contenue dans chaque
nœud et les informations stockées dans ses fils. On parle d’un min-heap si l’information de chaque
nœud est inférieure ou égale à celles de ses fils et d’un max-heap si l’information de chaque nœud
est supérieure ou égale à celles de ses fils. Notons qu’un heap est facilement implémentable par un
tableau dynamique.
Dans ce TP, on vous demande de réaliser les taches suivantes :
1/2
Institut National des Postes et Télécommunications
2012-2013
1- Lire, analyser et exécuter l’implémentation de l’ADT liste chaînée («LList») donnée sur les
pages 63-75 de votre polycopié (Le code est recopié en bas).
2- Modifier l’implémentation précédente pour être capable de traiter des listes circulaires. Une
liste circulaire est tout simplement une liste où le dernier élément de la liste pointe sur le
premier élément.
3- Modifier votre code pour pouvoir manipuler des files (construction, ajout, suppression,
recherche, parcours et tri).
4- Réutiliser votre implémentation pour permettre le traitement des piles de données.
5- Ecrire un programme pour inverser une liste chainée : le dernier élément devient le premier,
l’avant-dernier devient le deuxième dans la liste résultat, …, et le premier devient le dernier
dans la liste résultat. Penser à l’utilisation d’une pile pour effectuer le travail demandé.
6- Ecrire une classe C++ pour implémenter la structure de données tas («heap») ; votre classe
doit contenir des fonctions membres (c’est-à-dire, des méthodes) pour l’ajout, la
suppression, la recherche et l’affichage des éléments d’un «heap».
7- Ecrire un programme C++ pour trier une collection d’éléments en utilisant la structure de
données «heap» que vous avez implémentées dans la question précédente (Ce tri s’appelle
«heapSort» et sa complexité est (nlog(n))).
8- Comparer la complexité de vos méthodes (ajout, suppression, recherche, parcours) pour les
structures de données que vous avez implémentées. Que concluez-vous ?
2/2
Téléchargement