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

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

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

   ```cpp
   liste *renverser(liste *l);
   ```

   BEGIN SOLUTION

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

   END SOLUTION
