---
jupytext:
  text_representation:
    extension: .md
    format_name: myst
    format_version: 0.13
kernelspec:
  display_name: C++17
  language: C++17
  name: xcpp17
---

+++ {"tags": ["solution"]}

# Exercice : Approfondissements

Toutes les fonctions définies dans les questions précédentes sont suffisantes pour la
suite des TP. Vous êtes encouragés à vous assurer qu'elles fonctionnent parfaitement
avant de poursuivre.

1. Afin de diversifier les possibilités d'utilisation de notre liste, définissez une
   fonction permettant d'ajouter une valeur en queue de liste :

   ```cpp
   void ajouter_en_queue(liste *l, int val);
   ```

   BEGIN SOLUTION

   ```cpp
   void ajouter_en_queue(liste *l, int val) {
       elem *e = (elem *)malloc(sizeof(elem));
       e->val  = val;
       e->next = NULL;
       if (l->tete == NULL) {
           l->tete = e;
           l->nbelem = 1;
       } else {
           elem *iter = l->tete;
           while (iter->next != NULL)
               iter = iter->next;
           iter->next = e;
           l->nbelem++;
       }
   }
   ```

   END SOLUTION

2. Nous ne disposons actuellement d'aucun moyen de libérer la mémoire occupée par une
   liste. Ajoutez une fonction permettant de libérer toute la mémoire qui a été allouée
   pour les noeuds de la liste ainsi que pour la liste elle même.

   :::{attention}
   N'oubliez pas que vous ne devez jamais accéder au contenu d'une structure après en
   avoir libéré la mémoire.
   :::

   ```cpp
   void liberer_liste(liste *l);
   ```

   BEGIN SOLUTION

   Il faut veiller à ce que la valeur du pointeur next soit bien récupérée avant la
   libération de la mémoire. Généralement faire l'inverse va quand même marcher car la
   mémoire n'est pas réallouée entre les deux instructions; mais cela reste fragile !

   ```cpp
   void liberer_liste(liste *l) {
       elem *e = l->tete;
       while (e != NULL) {
           elem *tmp = e->next;
           free(e);
           e = tmp;
       }
       free(l);
   }
   ```

   END SOLUTION

3. Testez extensivement ces fonctions et les enchaînements entres ces fonctions et les précédentes.
   Une fois que vous avez tout bien testé, s'il vous reste du temps dans la séance de TP
   vous pouvez faire les exercices d'entrainement (ils sont a priori classés par ordre de difficulté croissante).
