Cliquez ici pour retirer la feuille de style si vous souhaitez imprimer ce document (ou en cas de problème d'affichage).

String

On souhaite se définir un type Mot qui code des mots sous forme de liste de lettre. Comme notre application va faire beaucoup d'opération sur les mots, comme les lire à l'envers par exemple, il faut que l'on puisse parcourir la liste dans les deux sens. C'est pourquoi chaque maillon contiendra en plus du caractère qu'il représente un pointeur sur le maillon suivant, mais également un pointeur sur le maillon précédant. Voici la définitions des types à utiliser :
  1. struct _cell{
  2. char c;
  3. struct _cell * suiv;
  4. struct _cell * prec;
  5. }
  6. typedef struc _cell Lettre;
  7. typedef Lettre * Mot;
Écrire les fonctions suivantes :
  • Lettre* allouer_lettre(char n); : alloue une cellule et l'initialise avec la valeur n. Retourne NULL si erreur.
  • void liberer_lettre(Lettre * l); : libère la mémoire associée à la seule cellule l
  • Mot allouer_mot(char * mot); : créé un Mot à partir d'une chaine de caractères au sens du C. Retourne NULL si erreur (en ayant nettoyé la mémoire)
  • void liberer_mot(Mot * m); : libère toute la mémoire associée à m (pourquoi est-il passé par adresse ? est-ce indispenssable ?)
  • void afficher_mot(Mot m); : affiche le mot m.
  • void afficher_mot_miroir(Mot m); : affiche le mot m à l'envers (fonction itérative).
  • int inserer_en_tete(Mot * m, char l): insère la lette l au début du mot m (pourquoi est-il passé par adresse ?). Retourne 1 si Ok, 0 si erreur.
  • int inserer_pos(Mot * m, char l, int pos): insère la lette l a la position pos du mot m (pourquoi est-il passé par adresse ?). Retourne 1 si Ok, -1 si erreur d'allocation, -2 si la position donnée est incohérente avec le mot.
  • int suprimer(Mot * m, char l): supprime toutes les occurences de la lettre l du mot m (pourquoi est-il passé par adresse ?). Retourne 1 si Ok, -1 si erreur.
  • void miroir(Mot *m); : retourne le mot m (pourquoi est-il passé par adresse ?). Choisissez si possible une solution qui ne parcours qu'une fois le mot et qui ne fait aucune allocation.
  • int est_anagramme(Mot m1, Mot m2); : retourne 1 si m1 et m2 contiennent les mêmes lettres (éventuellement dans un ordre différent). Il est conseillé de passer par une fonction intermédaire : int contient(Mot m, char l);
Quelle est l'espace mémoire nécessaire pour stocker avec cette structure le mot "Mot" par exemple ?