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