Sommaire ALGORITHME ET STRUCTURES DE DONNÉES II LES LISTES Liste simplement chaînée Liste doublement chaînée Liste circulaire Dr. Jihène Tounsi ISG de Sousse Site web http://www.jihenetounsi.com Email: tounsi.jihene@yahoo.fr Liste simplement chaînée Le nombre d élément n est pas connu à la création de la liste Une structure regroupant de données de même type Les données sont chaînées entre eux par des pointeurs. Un élément de la liste pointe sur l élément suivant Le dernier élément ne pointe sur rien (Pointeur Null) Une liste est accessible seulement par sa tête Structure Déclaration d un enregistrement représentant l élément de la liste avec les attributs Nom_Pointeur:^_élément s: Un Liste qui est un pointeur sur le premier élément de la liste Liste:^_élément
Structure Exemple 1 ant = pointeur stockant l @ de l élément suivant de la liste ant @ du 1 er élément de la liste Liste = pointeur sur le premier élément de la liste ant ant ant :entier ant:^element Les opérations sur les listes chaînées Opérations de création de liste Création Liste vide Opérations d accessibilité Afficher la longueur de la liste Afficher si Liste vide ou non Retourner Tête de la liste Retourner fin de la liste Les opérations sur les listes chaînées Opérations de modification Ajout début de liste Ajout Fin de la liste Insertion à un rang donné Opérations d affichage Recherche d un élément Affichage de tous les éléments Dans ce qui suit des exemples d implémentation de quelques fonctions
Fonction CréerListeVide() :Liste :entier ant:^element Fonction CréerListeVide():Liste Retourner Null //Utilisation de la fonction dans le programme principal L CréerListeVide(); Fonction EstVide(l:Liste) :Booléen :entier ant:^element Fonction EstVide(l:Liste):Booléen Si (l ==null) alors Retourner Vrai Retourner Faux Fonction longueur(l:liste) :entier :entier ant:^element Fonction longueur(l:liste):entier P:Liste P l Si (Non(EstVide(l))) alors N 1 Tant que (P^.suivant <>null) N N+1 P P^.suivant Fin Tant que N 0 Retourner(N) Fonction Accès(l:Liste, r:entier) :Liste Fonction Accès(l:Liste, r: entier):liste P:Liste Si (1<=r et r<= longueur(l)) alors //Obtenir 1 er élément de la liste N 1 //Facultatif on peut travailler avec l directement vu que le passage se fait par valeur P l Tant que (N<R) //Accéder à l élément suivant N N+1 P P^.suivant Fin Tant que Ecrire(«rang incorrecte») P Null Retourner(P)
Autres Fonctions d accès Accès Premier élément Fonction Accès_PremierElement(l:Liste):Liste Retourner(Accès(l,1)) Accès dernier élément Fonction Accès_DernierElement(l:Liste):Liste Retourner(Accès(l,longueur(l))) Procédure Insérer(l:liste,e:entier,r: entier) Procédure Insérer(l:Liste par adresse, e:entier,r: entier) P,NC:Liste Si (1<=r et r<= longueur(l)+1) alors Si (r==1) alors //ajout début de la liste ajouter TêteListe(l,e) Si (r== longueur(l)+1) alors //ajout Fin de la liste ajouter finliste(l,e) //ajout au sein de la liste P accès(l,r-1) //Allouer Dynamiquement une nouvelle cellule Nouveau(NC) //L allocation ne peut avoir lieu que s il y a de l espace Mémoire suffisant sinon Nouveau retourne NULL Si(NC) alors NC^.donnée e NC^.suivant P^.suivant P^.suivant NC Ecrire(«Mémoire Insuffisante») Ecrire(«rang incorrecte») Procédure ajoutertêteliste(l:liste,e:entier) Procédure ajoutertêteliste(l:liste par adresse, e:entier) P,NC:Liste //Allouer Dynamiquement une nouvelle cellule Nouveau(NC) Si (NC) alors NC^.donnée e Si (Estvide(l)) alors //Créer le premier élément de la liste NC^.suivant Null l NC //Créer le premier élément de la liste et le chaîner aux restes des éléments NC^.suivant l l NC Ecrire(«Mémoire Insuffisante») Procédure ajouterfinliste(l:liste,e:entier) Procédure ajouterfinliste(l:liste par adresse, e:entier) P,NC:Liste Si (Estvide(l)) alors // le premier élément et aussi le dernier de la liste ajoutertêteliste(l,e) //Allouer Dynamiquement une nouvelle cellule Nouveau(NC) Si (NC) alors NC^.donnée e //accéder au dernier élément P accès(l,longueur(l)) //le dernier élément de la liste doit pointer sur NC P^.suivant NC //NC est maintenant le dernier élément donc il n a pas de suivant NC^.suivant null Ecrire(«Mémoire Insuffisante»)
Sommaire Liste simplement chaînée Liste doublement chaînée Liste circulaire Liste doublement chaînée C est une variante de la liste simplement chaînée Les données sont chaînées entre eux par deux pointeurs. Un élément de la liste pointe sur l élément suivant et l élément précédent Le dernier élément pointe seulement sur son prédécesseur Le premier élément pointe seulement sur son successeur Une liste est accessible par sa tête et par sa fin Structure Exemple 1 ant = pointeur stockant l @ de l élément suivant de la liste @ du 1 er élément de la liste ant = pointeur stockant l @ de l élément précédent de la liste Liste = pointeur sur le premier élément de la liste :entier :^element Prec:Liste //equivalent à ^element
Sommaire Liste simplement chaînée Liste doublement chaînée Liste circulaire Liste circulaire Même chose que la liste doublement chaînée Les données sont chaînées entre eux par deux pointeurs. Un élément de la liste pointe sur l élément suivant et l élément précédent Le dernier élément pointe sur son prédécesseur mais aussi sur le premier élément de la liste Le premier élément peut pointer seulement sur son successeur (structure 1), ou sur successeur et son prédécesseur (dernier élément de la liste) (structure 2). Structure 1 Structure 2 ant = pointeur stockant l @ de l élément suivant de la liste ant = pointeur stockant l @ de l élément précédent de la liste @ du 1 er élément de la liste Liste = pointeur sur le premier élément de la liste
Application Écrire une procédure qui permet d afficher la liste simplement chaînée de personnes. Une personne est défini par son nom, son CIN et son genre (F ou M). Fin chapitre 2 Même chose pour une liste doublement chaînée Même chose pour une liste circulaire Que peut on conclure??