:: Enseignements :: ESIPE :: E3INFO :: 2015-2016 :: Algorithmique ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | 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, qu'on peut appeler
lexique
ou
lexicon:
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
-
cell *allocate_cell(char word[]) 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 word (le caractère '\0' de terminaison inclus) et
initialiser le champ word, le champ occurrence
signifiant qu'il n'y a qu'une occurrence et le champ next
à NULL.
S'il n'y a plus de place disponible, la fonction renvoie la valeur NULL ;
-
int insert_in_lexicon(lexicon *lex, char word[]) qui insère
la valeur word dans le lexique *lex.
Si le mot apparaît déjà dans la liste, vous devrez incrémenter le
champ occurrence.
La fonction renvoie l'adresse de la cellule correspondant au mot ajouté,
ou NULL en cas de problème ;
-
void print_lexicon(lexicon lex) qui affiche le lexique dans l'ordre
alphabétique en donnant pour chaque mot son nombre d'occurrence ;
-
cell *find_in_lexicon(lexicon lex, char word[]) qui renvoie
l'adresse de la cellule contenant le mot word.
La fonction renvoie NULL si le mot n'est pas présent dans le lexique lex ;
-
int word_occurrence_in_lexicon(lexicon lex, char word[])
qui renvoie le nombre d'occurrences du mot word dans le lexique lex ;
-
void free_lexicon(lexicon *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 :
-
int read_text(FILE *input, lexique *lex) qui lit les mots
d'un fichier de texte input et qui construit le lexique.
Cette fonction retournera -1 en cas de problème et 0 si
tout s'est bien passé.
-
void save_lexicon(FILE *output, lexique lex) qui
sauvegarde le lexique dans le fichier output.
Chaque ligne du fichier output
devra contenir le mot suivi de son nombre d'occurrence 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.
© Université de Marne-la-Vallée