#!/usr/bin/env python3
"""
Partie "exercices" : le tri du nain la tête en bas.
"""

# Cette ligne sert à désactiver un message inutile de pylint :
# pylint: disable=too-few-public-methods

class Cellule:
    """
    Une cellule est constituée :
    - d'une valeur ;
    - d'un pointeur vers la cellule précédente ;
    - d'un pointeur vers la cellule suivante.
    """

    def __init__(self, val, prec, suiv):
        """
        Constructeur d'une cellule.
        """
        self.val = val
        self.prec = prec
        self.suiv = suiv

    def __str__(self):
        """
        Afficheur d'une cellule.
        """
        return f"{self.val}"

class Liste:
    """
    La classe représentant les listes doublement chaînées.
    """

    def __init__(self):
        """
        Crée une liste doublement chaînée avec éléments fictifs en tête et en queue.
        """
        self.tete = Cellule("T", None, None)
        self.queue = Cellule("Q", None, None)
        self.tete.suiv = self.queue
        self.queue.prec = self.tete

def remplir_liste(liste, tab):
    """
    Remplit la liste avec les mêmes éléments que le tableau et dans le même ordre.
    Ne renvoie rien car la liste passée en paramètre est modifiée.
    """
    for val in tab:
        nouv = Cellule(val, liste.queue.prec, liste.queue)
        liste.queue.prec.suiv = nouv
        liste.queue.prec = nouv

def afficher_liste(liste):
    """
    Affiche le contenu de la liste (y compris les deux cellules fictives).
    """
    cour = liste.tete
    while cour is not None:
        print(cour, end="" if cour.suiv is None else " <-> ")
        cour = cour.suiv
    print()

def echanger_cellules(cell):
    """
    Échange cell avec cell.prec puis renvoie le pointeur mis à jour.
    Pré-condition : cell et cell.prec sont des cellules significatives
      (c.a.d ni la tête ni la queue) de la liste.
    """
    # TODO
    ...

def trier_liste(liste):
    """
    Tri la liste selon l'algorithme du nain de jardin qui a la tête en bas.
    """
    # TODO
    ...
