:: Enseignements :: ESIPE :: E3INFO :: 2014-2015 :: Algorithmique ::
[LOGO]

Listes chaînées triées


Le but de ce TP est de manipuler les listes chaînées triées de mots.
Les définitions de type suivantes permettent de représenter une liste chaînée triée de mots :

Vous trouvez dans la librairie <string.h>, des fonctions permettant de faire des opérations sur des chaînes de caractères : les comparer, les copier, etc.

Exercice 1 - Listes triées de mots

Écrire les fonctions
  1. Cellule *allouerCellule(char mot[]) qui alloue l'espace mémoire nécessaire pour une nouvelle cellule et retourne l'adresse de cette nouvelle cellule. La fonction doit allouer la place nécessaire pour le mot (le caractère '\0' de terminaison inclus) et initialiser le champ mot, le champ occurrence signifiant qu'il n'y a qu'une occurrence et le champ suivant à NULL. S'il n'y a plus de place disponible, la fonction renvoie la valeur NULL ;
  2. int insererAPlace(Lexique *lex, char mot[]) qui insère la valeur mot dans le lexique *lex. Si le mot apparaît déjà dans la liste, vous devrez incrémenter le champ occurrence. La fonction renvoie 0 en cas de problème et 1 sinon ;
  3. void afficherLexique(Lexique lex) qui affiche dans l'ordre alphabétique le lexique lex ;
  4. Cellule *rechercher(Lexique lex, char mot[]) qui renvoie l'adresse de la cellule contenant le mot mot. La fonction renvoie NULL si le mot n'est pas présent dans le lexique lex ;
  5. int nbOccMot(Lexique lex, char mot[]) qui renvoie le nombre d'occurrences du mot mot dans le lexique lex ;
  6. void libererLexique(Lexique *lex) qui libère tout l'espace mémoire occupé par le lexique *lex.

Exercice 2 - Manipulations de fichiers

Pour ouvrir et fermer des fichiers en C, on utilise les deux fonctions fopen et fclose de la librairie <stdio.h> :
Le paramètre mode de la fonction fopen détermine si on ouvre le fichier pour la lecture ("r") ou pour l'écriture ("w"). La fonction renvoie un pointeur FILE * qui représente le fichier, ou NULL en cas d'erreur. Ensuite, on se sert de ce pointeur pour lire ou écrire en utilisant fscanf et fprintf qui fonctionnent comme scanf et printf mais qui prennent en premier argument le pointeur du fichier.


Écrire les deux fonctions suivantes :
  1. int lireTexte(FILE *entree, Lexique *lex) qui lit les mots d'un fichier de texte entree et qui construit le lexique. Cette fonction retournera 0 en cas de problème et 1 sinon.
  2. void sauvegarderLexique(FILE *sortie, Lexique lex) qui sauvegarde le lexique dans le fichier sortie. Chaque ligne du fichier sortie devra contenir le mot suivi du nombre d'occurrences séparés par un espace.

Exercice 3 - La fonction principale

Écrire une fonction main qui permet de tester toutes ces fonctions. Les noms des fichiers pour la lecture du texte et la sauvegarde du lexique devront être transmis sur la ligne de commande. Les tests nécessaires à l'ouverture des fichiers devront être faits dans la fonction principale.

Exercice 4 - Les positions des mots dans le texte (facultatif)

Modifier la structure et les fonctions précédentes afin d'enregistrer, via une liste chaînée d'entiers pour chaque mot, les positions de ce mot dans le texte.