---
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 implémentées dans les questions précédentes sont
suffisantes pour la suite des TP et 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,
    ajoutez une fonction permettant d'insérer une valeur en queue de liste
    cette fois-ci :

    ```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érer la mémoire.*

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

    BEGIN SOLUTION

    Faire très attention ici 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 ça reste une erreur !

    ```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

