Exercice : Approfondissements

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 :

    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éré la mémoire.

    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 !

    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).