Langage C - Travaux Dirigés n° 8

IUP Mathématiques-Informatique


Le but de cette séance de Td est d'écrire un programme qui détecte des lignes identiques dans un fichier. De façon plus précise, le programme construit la liste de toutes les lignes différentes qui apparaissent dans le fichier et compte le nombre d'occurrences de chacune de ces lignes.

Pour construire la liste, on introduit les types Cellule et Liste définis de la façon suivante :

// Type des cellules pour les listes chaînées
struct Cellule {
  char* str;                    // Pointeur sur la chaîne
  int nbr;                      // Nombre d'occurrences
  Cellule *next;                // Pointeur sur la cellule suivante
};
typedef Cellule* Liste;

Exercice n° 1 (Allocation)

Écrire une fonction cellAlloc pour l'allocation d'une cellule. Cette fonction prend en paramètre une chaîne de caractères et retourne une cellule. Cette fonction doit pouvoir être utilisée de la manière suivante;

  Cellule* c = cellAlloc("Une chaine");

Exercice n° 2 (Construction de la liste)

Écrire une fonction cellCons qui ajoute une cellule à une liste. L'ajout de la nouvelle cellule est fait en tête de liste. Cette fonction prend en paramètre la cellule et la liste.

Exercice n° 3 (Recherche)

Écrire une fonction qui recherche une chaîne de caractères dans une liste. Cette fonction retourne un pointeur sur la première cellule qui contient la chaîne ou la valeur 0 si aucune cellule ne contient la chaîne.

Exercice n° 4

Écrire un programme global qui lit sur l'entrée standard et qui construit la liste des lignes différentes. Chaque cellule contient une des lignes et son nombre d'occurrences. À la fin, le programme affiche chaque ligne avec son nombre d'occurrences.

Exercice n° 5

Modifier le programme de l'exercice précédent pour qu'il accepte le nom d'un fichier sur la ligne de commande. La lecture se fait alors dans le fichier au lieu de l'entrée standard.

Exercice n° 6

Modifier le programme de l'exercice précédent pour qu'il puisse accepter plusieurs noms de fichier sur la ligne de commande. Si aucun nom de fichier n'est présent sur la ligne de commande, le programme lit sur l'entrée standard.