Le principe de la liste chaînée

Le schéma ci-dessous illustre le principe d'une liste chaînée : chaque cellule est constitué d'une valeur et d'une adresse mémoire. Cette adresse réfère à la valeur suivante.

La liste chainée est une façon parmi d'autres d'implémenter les listes.

listeChainee.jpg

La liste ci-dessus peut être notée :

(1, address->) (4 , address->) (7, address->) (2 , address->) (0, None)

implémentation

On organise l'implémentation avec 2 classes :

Ajouter un élément en fin de liste

Le principe est simple :

listeChaineeADD.jpg

Déterminer la longueur de la liste

Lorsque l'on utilise les listes Python, la fonction len(liste) renvoie la longueur de la liste.

Il s'agit ici de redéfinir pour nos listes la méthode len..

En voici le principe:

def __len__(self):
    si la liste est vide:
        on renvoie 0
    sinon:
        compteur <--1
        tmp <-- le début de la liste (la liste)
        tant que tmp.fille est pas vide:
            compteur <-- compteur+1
            tmp <-- tmp.fille
        on renvoie le compteur

À faire :

Réaliser la méthode len

Accéder à un élément de la liste

Lorsque l'on manipule des listes Python, l'instruction liste[i] donne accès à l'élément d'indice i.

À faire :

Compléter la méthode acces(self,pos) qui prend en paramètre un indice i et qui renvoie l'élément d'indice i de la liste

Insérer un élément à l'indice n

Supposons qu'on souhaite dans notre liste insérer un élément après le 4 pour obtenir cette liste : 1,4,12,7,2,0

listeChaineeINS.jpg

La méthode consiste à se positionner à l'endroit où l'on souhaite faire l'insertion (sur le 7 dans ce cas) et de la remplacer par une nouvelle cellule dont la valeur est l'élément à inserer et sa fille le reste de la liste.

À faire :

Compléter la méthode inserer(self,el,pos) ci dessous:

D'autres méthodes...

À faire :

Il s'agit ici de réaliser les méthodes : (et de les tester)

Des fonctions

À faire:

Écrire des fonctions qui renvoie:

Concaténation de deux listes

Voici une méthode qui réalise la concaténation de deux listes par addition

def __add__(self,other):
        if self.est_vide():
            return other
        elif other.est_vide():
            return self
        else:
            lst_tmp=Liste()
            # ajout de la 1ère liste
            tmp = self.debut
            lst_tmp.ajouter(tmp.valeur)
            while tmp.fille is not None:
                tmp = tmp.fille
                lst_tmp.ajouter(tmp.valeur)
            # ajout de la 2ème liste
            tmp = other.debut
            lst_tmp.ajouter(tmp.valeur)
            while tmp.fille is not None:
                tmp = tmp.fille
                lst_tmp.ajouter(tmp.valeur)
            return lst_tmp

À faire:

Implémenter cette méthode et faire des essais

lst4=Liste()
lst5=Liste()
t4=(5,4,3,0,1,8)
t5=(12,0,54,78,9)

for el in t4:
    lst4.ajouter(el)
print(lst4)
for el in t5:
    lst5.ajouter(el)
print(lst5)
print(lst4+lst5)

lst6=Liste()
print(lst5+lst6)

résultats attendus

[5]->[4]->[3]->[0]->[1]->[8]
[12]->[0]->[54]->[78]->[9]
[5]->[4]->[3]->[0]->[1]->[8]->[12]->[0]->[54]->[78]->[9]
[12]->[0]->[54]->[78]->[9]

Le tri rapide (Quick sort)

On considère une liste

Voici un algorithme récursif de tri rapide

fonction tri_rapide(liste):