TD 7

Ce TD est formé de plusieurs parties, qui demandent principalement de manipuler des listes chaînées, de caractères ou de chaînes de caractères. Pour chacune des parties, on fournit un fichier de tests. On conseille fortement d'effectuer ces tests. Tant que vous n'avez pas répondu à toutes les questions d'une partie, pour effectuer vos tests, il faut commenter les lignes superflues.

Vous déposerez vos fichiers en utilisant la ligne de commande :
/users/profs/info/Depot/INF_321/deposer *.java TD_7 numéro_du_groupe
Le numéro de groupe est celui que vous avez en INF321, compris entre 17 et 24. Vous pouvez déposer plusieurs fois, le dernier dépôt sera pris en compte.

Listes de mots

On demande pour commencer de créer une classe de liste de mots, appelée ListeDeMots. Rajoutez-y ensuite
Attention : toutes les fonctions précédentes devront gérer correctement le cas de la liste vide.
Pour tester on donne ici une classe TestPartie1.


N'oubliez pas de déposer !

Tri fusion

L'objectif de la seconde partie est d'implanter le tri fusion pour les listes ci-dessus. On demande pour cela d'écrire les fonctions Pour tester on donne ici une classe TestPartie2.

Il n'est pas nécessaire de traiter la question suivante (plus difficile) pour faire la suite du TD.
N'oubliez pas de déposer !

Listes circulaires de caractères

Dans cette partie, on travaille avec des listes de caractères. Une liste contiendra un caractère appelé contenu et une liste appelée suivant. On fait l'hypothèse que ces listes sont circulaires : pour toute liste l, soit l est la liste vide, soit il existe i > 0 tel que l.suivant.suivant.suivant...suivant(avec i répétitions) est égal à l (égalité physique). La classe s'appellera donc ListeCirculaire.
Rappel : vous pouvez faire appel aux fonctions implémentées dans les questions précédentes en les préfixant par le nom de la classe où elles sont définies (syntaxe Classe.fonction).
Pour tester on donne ici une classe TestPartie3.

Les deux fonctions suivantes (plus difficiles) ne sont pas nécessaires dans la suite.

N'oubliez pas de déposer !

Mots de Lyndon

Le but de cette dernière partie est le suivant. On se donne un alphabet A (un ensemble fini de lettres), une taille fixée n, et on considère l'ensemble E de tous les mots de taille n formé des lettres de A. On se propose de construire un mot le plus petit possible qui contienne (vu cycliquement) comme sous-mots tous les mots de E.
Exemple. On prend A='0', '1', '2'; on peut vérifier que 000100201101202102211121222 contient (si on le voit cycliquement) tous les mots de taille 3.

Pour y parvenir, on donne pour commencer deux définitions : On dit alors qu'un mot est de Lyndon si la liste circulaire qui lui est associée est non cyclique et minimale parmi ses décalées. Par exemple, 0001 ou 0123 sont des mots de Lyndon, mais 0101 non (il est cyclique), et 2301 non plus (il n'est pas minimal).

Toutes les fonctions de cette partie sont à écrire dans une classe Lyndon.
Rappel : vous pouvez faire appel aux fonctions implémentées dans les questions précédentes en les préfixant par le nom de la classe où elles sont définies (syntaxe Classe.fonction).
Pour tester on donne ici une classe TestPartie4.

N'oubliez pas de déposer !