Exercice: Mise en place

Exercice: Mise en place#

Dans ce TP, certaines fonctions de manipulation de listes vont agir de manière destructive sur les listes qui leur sont données et renvoyer une nouvelle liste. C’est le cas de la fonction renverser de ce premier exercice, tester la en profondeur pour bien en comprendre le mécanisme.

  1. Commencez par écrire une fonction permettant de transférer la valeur en tête d’une liste vers une autre liste.

    void deplacer_tete(liste *l1, liste *l2);
    

    Cette fonction peut être implémentée à l’aide des fonctions d’ajout et de suppression des TP précédents mais il est possible de l’écrire de manière plus simple et plus efficace en transférant directement l’élément comme vu en cours.

    BEGIN SOLUTION

    Attention ici de ne pas oublier de mettre à jour les compteurs d’éléments.

    void deplacer_tete(liste *l1, liste *l2) {
        elem *e = l1->tete;
        l1->tete = e->next;
        l1->nbelem - -;
        e->next = l2->tete;
        l2->tete = e;
        l2->nbelem++;
    }
    

    END SOLUTION

  2. À l’aide de la fonction précédente il est maintenant très facile d’écrire une fonction permettant de renverser les valeurs d’une liste. Cette fonction va renvoyer une nouvelle liste et devra donc bien penser à libérer l’ancienne.

    liste *renverser(liste *l);
    

    BEGIN SOLUTION

    liste *renverser(liste *l) {
        liste *r = nouvelle_liste();
        while (l->nbelem != 0)
            deplacer_tete(l, r);
        liberer_liste(l);
        return r;
    }
    

    END SOLUTION