Exercice : Approfondissements

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 :

    void ajouter_en_queue(liste *l, int val);
    

    BEGIN SOLUTION

    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.

    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 !

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

    END SOLUTION