Niveau : Terminale générale, enseignement de spécialité NSI
Définition
Une liste est une suite finie éventuellement vide d'éléments repérés selon leur rang (ou indice) dans la liste.
On manipule cette structure de données grâce à des opérations de base, comme :Remarque.
La définition ci-dessus décrit le type liste de façon abstraite : on ne donne pas la façon de représenter cette structure dans un ordinateur. Il existe différentes façons de représenter le type abstrait liste, notamment les tableaux et les listes chaînées
Schématisons la mémoire d'un ordinateur comme un ensemble de cases dans lesquelles sont stockées des valeurs. Chacune de ces cases a une adresse, grâce à laquelle on peut accéder au contenu de la case.
Définition
Remarque
La fin de la liste est marquée par une cellule particulière, dont la valeur est ici représentée
par le symbole ⊥ (ce symbole s'appelle "bas", ou "bottom" en anglais). En Python, nous
traduirons ce symbole par l'objet None
.
Schéma :
Remarque.
Il existe des variantes des listes chaînées, notamment les listes doublement chaînées dans lesquelles chaque cellule contient l'adresse de la cellule suivante et de la cellule précédente.
La vidéo suivante, de 5 min 54s à 13 min 35s, montre une méthode d'implantation une liste chainée en langage python.
Remarque.
Dans ce qui suit, nous allons mettre en œuvre des listes chaînées d'entiers. Mais on pourrait remplacer les entiers par n'importe quel type.
Pour implémenter nos listes chaînées, nous allons créer une classe Cellule. Les objets de cette classe ont deux attributs :
Pour créer un objet de type Cellule, il suffit alors de faire un appel du constructeur par élément de la liste : ligne 12 du code ci-dessus
Exercice :
Compléter le code Python ci-dessus :
ma_liste
en créant les cellules les unes après les autres en trois lignes de code,
Remarque.
Pour représenter la liste vide, on donne la valeur None
aux attributs valeur et suivant.
Dans la ligne 4 du code ci-dessus, les paramètres val
et suiv
du constructeur ont pour valeur
par défaut : None
. De cette façon, le constructeur appelé sans paramètre produira une liste
vide.
Le code suivant contient le début de l'implémentation de la classe Liste. En plus du constructeur, il contient la méthode __str__
qui permet d'utiliser
print pour des objets de classe Liste, et une méthode est_vide
qui retourne True
si la liste
est vide et False
sinon.
Dans tout ce qui suit, on complète ou on utilise la classe Cellule fournie précédente.
Toutes les fonctions, procédures et méthodes demandées ont une version itérative et une version récursive. Les deux versions sont demandées.
Les exemples présentés dans les exercices se basent sur la variable :
liste = Cellule(42, Cellule(5, Cellule(14, Cellule())))
Remarque : On rajoute une cellule vide contenant None et None pour repérer la fin de la liste chainée (on peut l'appeler cellule fantôme)
Compléter la classe Cellule en y ajoutant une méthode __len__
qui :
La méthode __len__
permet d'utiliser la fonction len avec un objet de classe Cellule en
paramètre. Par exemple len(liste)
devra retourner 3.
Compléter la classe Cellule en y ajoutant une méthode __getitem__
qui :
La méthode __getitem__
permet d'utiliser la notation avec des crochets pour un objet de
classe Cellule. Par exemple liste[2]
devra retourner 14
.
Si l'indice i dépasse de la liste, on pourra générer une erreur grâce à l'instruction :
raise IndexError("Indice trop grand !")
Compléter la classe Cellule en y ajoutant une méthode __add__
qui :
Cellule
,La méthode __add__
permet d'utiliser l'opération + pour deux objets de classe Cellule. Par
exemple si on a :
liste2 = Cellule(8, Cellule(10, Cellule()))
alors liste + liste2
devra retourner la liste | 42, 5, 14, 8, 10 |
.
Attention, la méthode __add__ ne devra pas avoir d'effets de bord.
Compléter la classe Cellule en y ajoutant une méthode inserer qui :
Par exemple après appel à liste.inserer(1, 200) la variable liste devra être égale à | 42, 200, 5, 14 |.
Compléter la classe Cellule en y ajoutant une méthode modifier qui :
Par exemple après appel à liste.modifier(1, 100), la variable liste devra valoir | 42, 100, 14 |
.
Compléter la classe Cellule en y ajoutant une méthode supprimer qui :
i
de self
(effet de bord).Par exemple après appel à liste.supprimer(1)
la variable liste devra valoir | 42, 14 |
.
Compléter la classe Cellule en y ajoutant une méthode renverser
qui :
self
(effet de bord).Par exemple après appel à liste.renverser()
la variable liste
devra valoir | 14, 5, 42 |
.
Écrire en dehors de la classe une fonction nb_occurrences
qui :
Cellule
noté liste
, et un entier valeur,Par exemple nb_occurrences(liste, 42)
devra retourner 1.
Écrire une fonction (en dehors de la classe) minimum
qui :
Cellule
noté liste
,
liste
.Par exemple minimum(liste)
devra retourner 5
Remarque.
Attention, l'implémentation des listes chaînées proposée ici est un choix. Il en existe bien sûr de nombreuses variantes, et il faut être capable de s'adapter.
Fond : Texte : Tables : Thème du langage:
Contenu
sous
licence CC BY-NC-SA 3.0
Amandine SCHREK 27/10/2022
Mise à jour le 03/12/2023