Chapitre 10 Listes chaînées

Documents pareils
Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

6. Hachage. Accès aux données d'une table avec un temps constant Utilisation d'une fonction pour le calcul d'adresses

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Systemes d'exploitation des ordinateurs

Recherche dans un tableau

Cours Informatique Master STEP

Structure fonctionnelle d un SGBD

CORRECTION EXERCICES ALGORITHME 1

Initiation à la programmation en Python

L exclusion mutuelle distribuée

LE PROBLEME DU PLUS COURT CHEMIN

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

Reaper : utilisations avancées

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

4D Server et les licences : fonctionnement et environnement

Génie Logiciel avec Ada. 4 février 2013

Série TD 3. Exercice 4.1. Exercice 4.2 Cet algorithme est destiné à prédire l'avenir, et il doit être infaillible! Exercice 4.3. Exercice 4.

Vers l'ordinateur quantique

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

modélisation solide et dessin technique

Algorithmique et programmation : les bases (VBA) Corrigé

Définitions. Numéro à préciser. (Durée : )

Pluridisciplinarité. Classe de BTS DATR

Chapitre 1 : Introduction aux bases de données

Traitement de texte : Quelques rappels de quelques notions de base

Introduction à MATLAB R

Programmation Objet - Cours II

Correction TD algorithmique

Sauvegarde des données du scribe sur disque USB

TUTORIAL REUTERS. Utilisation de l'utilitaire de recherche Reuters

Pourquoi l apprentissage?

Algorithmique avec Algobox

ésylog, direction technique Esylog_PeerBackup outil de sauvegarde individuelle mails & fichiers personnels documentation technique

Algorithmes de recherche

Application 1- VBA : Test de comportements d'investissements

ACTIVITÉ DE PROGRAMMATION

Programmation C++ (débutant)/instructions for, while et do...while

Plan du cours Cours théoriques. 29 septembre 2014

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Protosafe : un service en ligne d archivage de données médicales

Salle de technologie

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/ Présentation. 1.2 Ressources

Administration du site (Back Office)

Exercices INF5171 : série #3 (Automne 2012)

Organigramme / Algorigramme Dossier élève 1 SI

Chapitre 1 Régime transitoire dans les systèmes physiques

Uniformiser la mise en forme du document. Accélère les mises à jour. Permets de générer des tables de matières automatiquement.

Les différents types de données et leurs opérations de base

C f tracée ci- contre est la représentation graphique d une

Architecture des Systèmes d Information Architecture des Systèmes d Information

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Algorithmes récursifs

Module 02 - Leçon 04 : Evaluation des stocks

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

CHAPITRE IX : Les appareils de mesures électriques

Partie 7 : Gestion de la mémoire


Méthodes de développement. Analyse des exigences (spécification)

Système binaire. Algèbre booléenne

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Architecture des ordinateurs

Support Agile avec Kanban quelques trucs et astuces par Tomas Björkholm

Informatique industrielle A Systèmes temps-réel J.F.Peyre. Partie I : Introduction

Algorithmique avec Algobox

NOTATIONS PRÉLIMINAIRES

Feuille TD n 1 Exercices d algorithmique éléments de correction

Guide pour la réalisation d'un document avec Open Office Writer 2.2

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

STAGE IREM 0- Premiers pas en Python

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Cours d Informatique

1. Utilisation du logiciel Keepass

Trier les ventes (sales order) avec Vtiger CRM

Utilisation de l'outil «Open Office TEXTE»

Cahier Technique Différences Batigest Standard/Evolution. Apibâtiment. Documentation technique

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Chapitre 4 Pierre, papier, ciseaux

Retrospect 7.7 Addendum au Guide d'utilisation

Le module Supply Chain pour un fonctionnement en réseau

LES ACCES ODBC AVEC LE SYSTEME SAS

Bases de programmation. Cours 5. Structurer les données

Projet Active Object

"Indy\Source\Fulld7.bat" 6. Lancer à présent Delphi. Allez dans le menu "Composant" puis sur "Installer des paquets...".

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

PARCOURS COMPLET AU COURS MOYEN

Introduction aux SGBDR

Informatique Générale

Calculateur quantique: factorisation des entiers

Le stockage local de données en HTML5

Chapitre 5 : Flot maximal dans un graphe

Cahier des Clauses Techniques Particulières

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Transcription:

Chapitre 10 Listes chaînées 1. Structures de données linéaires armi les structures de données linéaires il y a : les tableaux, les listes chaînées, les piles, les files. Les structures de données linéaires induisent une notion de séquence entre les éléments les composant (1 er, 2 ème, 3 ème, suivant, dernier ). 1.1. Les tableaux Vous connaissez déjà la structure linéaire de type tableau pour lequel les éléments de même type le composant sont placés de façon contigüe en mémoire. our créer un tableau, à 1 ou 2 dimensions, il faut connaître sa taille qui ne pourra être modifiée au cours du programme, et lui associer un indice pour parcourir ses éléments. our les tableaux la séquence correspond aux numéros des cases du tableau. On accède à un élément du tableau directement grâce à son indice. Soit le tableau à 1 dimension suivant nommé Tablo : 12 14 10 24 our atteindre la troisième case du tableau il suffit d'écrire Tablo[3] qui contient 10, si les valeurs de l indice commencent à 1. La structure de type tableau pose des problèmes pour insérer ou supprimer un élément car ces actions nécessitent des décalages du contenu des cases du tableau qui prennent du temps dans l'exécution d'un programme. Ce type de stockage de valeurs peut donc être coûteux en temps d'exécution. Il existe une autre structure, appelée liste chaînée, pour stocker des valeurs, cette structure permet plus aisément d'insérer et de supprimer des valeurs dans une liste linéaire d'éléments. 1.2. Les listes chaînées Une liste chaînée est une structure linéaire qui n'a pas de dimension fixée à sa création. Ses éléments de même type sont éparpillés dans la mémoire et reliés entre eux par des pointeurs. Sa dimension peut être modifiée selon la place disponible en mémoire. La liste est accessible uniquement par sa tête de liste c est-à-dire son premier élément. our les listes chaînées la séquence est mise en oeuvre par le pointeur porté par chaque élément qui indique l'emplacement de l'élément suivant. Le dernier élément de la liste ne pointe sur rien (). On accède à un élément de la liste en parcourant les éléments grâce à leurs pointeurs. Chapitre 10 1 / 12

Soit la liste chaînée suivante (@ indique que le nombre qui le suit représente une adresse) : Adresses @ : 3 @ : 24 @ : 8 @ : 56 Données Voici une liste chaînée ointeurs 24 8 56 our accéder au troisième élément de la liste il faut toujours débuter la lecture de la liste par son premier élément dans le pointeur duquel est indiqué la position du deuxième élément. Dans le pointeur du deuxième élément de la liste on trouve la position du troisième élément our ajouter, supprimer ou déplacer un élément il suffit d'allouer une place en mémoire et de mettre à jour les pointeurs des éléments. Il existe différents types de listes chaînées : Liste chaînée simple constituée d'éléments reliés entre eux par des pointeurs. Liste chaînée ordonnée où l'élément suivant est plus grand que le précédent. L'insertion et la suppression d'élément se font de façon à ce que la liste reste triée. Liste doublement chaînée où chaque élément dispose non plus d'un mais de deux pointeurs pointant respectivement sur l'élément précédent et l'élément suivant. Ceci permet de lire la liste dans les deux sens, du premier vers le dernier élément ou inversement. Liste circulaire où le dernier élément pointe sur le premier élément de la liste. S'il s'agit d'une liste doublement chaînée alors de premier élément pointe également sur le dernier. Ces différents types peuvent être mixés selon les besoins. On utilise une liste chaînée plutôt qu'un tableau lorsque l'on doit traiter des objets représentés par des suites sur lesquelles on doit effectuer de nombreuses suppressions et de nombreux ajouts. Les manipulations sont alors plus rapides qu'avec des tableaux. Résumé Structure Dimension osition d'une information Accès à une information Tableau Fixe ar son indice Directement par l'indice Liste chaînée Evolue selon les actions ar son adresse Séquentiellement par le pointeur de chaque élément 1.3. Les piles et les files Les files et les piles sont des listes chaînées particulières qui permettent l'ajout et la suppression d'éléments uniquement à une des deux extrémités de la liste. Structures Ajout Suppression Type de Liste ILE LIFO (Last In First Out) FILE Queue FIFO (First In First Out) La pile est une structure de liste similaire à une pile d'assiettes où l'on pose et l'on prend au sommet de la pile. La file est une structure de liste similaire à une file d'attente à une caisse, le premier client entré dans la file est le premier sorti de celle-ci (aucun resquillage n'est admis). Chapitre 10 2 / 12

2. Listes chaînées 2.1. Définitions Un élément d'une liste est l'ensemble (ou structure) formé : d'une donnée ou information, d'un pointeur nommé Suivant indiquant la position de l'élément le suivant dans la liste. A chaque élément est associée une adresse mémoire. Les listes chaînées font appel à la notion de variable dynamique. Une variable dynamique: est déclarée au début de l'exécution d'un programme, elle y est créée, c'est-à-dire qu'on lui alloue un espace à occuper à une adresse de la mémoire, elle peut y être détruite, c'est-à-dire que l'espace mémoire qu'elle occupait est libéré, l'accès à la valeur se fait à l'aide d'un pointeur. Un pointeur est une variable dont la valeur est une adresse mémoire (voir chapitre 9). Un pointeur, noté, pointe sur une variable dynamique notée ^. Le type de base est le type de la variable pointée. Le type du pointeur est l'ensemble des adresses des variables pointées du type de base. Il est représenté par le symbole ^ suivi de l'identificateur du type de base. Exemple: Info Suivant 3 Essai ^ La variable pointeur pointe sur l'espace mémoire ^ d'adresse 3. Cette cellule mémoire contient la valeur "Essai" dans le champ Info et la valeur spéciale dans le champ Suivant. Ce champ servira à indiquer quel est l élément suivant lorsque la cellule fera partie d une liste. La valeur indique qu il n y a pas d'élément suivant. ^ est l'objet dont l'adresse est rangée dans. Les listes chaînées entraînent l'utilisation de procédures d'allocation et de libération dynamiques de la mémoire. Ces procédures sont les suivantes: Allouer() : réserve un espace mémoire ^ et donne pour valeur à l'adresse de cet espace mémoire. On alloue un espace mémoire pour un élément sur lequel pointe. Désallouer() : libère l'espace mémoire qui était occupé par l'élément à supprimer ^ sur lequel pointe. our définir les variables utilisées dans l'exemple ci-dessus, il faut : définir le type des éléments de liste : Type Cellule= Structure Info : Chaîne Suivant : Liste fin Structure définir le type du pointeur : Type Liste = ^Cellule déclarer une variable pointeur : Var : Liste allouer une cellule mémoire qui réserve un espace en mémoire et donne à la valeur de l'adresse de l'espace mémoire ^ : Allouer() affecter des valeur à l'espace mémoire ^: ^.Info "Essai" ; ^.Suivant Quand = alors ne pointe sur rien. Chapitre 10 3 / 12

2.2. Listes chaînées simples Une liste chaînée simple est composée : d'un ensemble d'éléments tel que chacun : o est rangé en mémoire à une certaine adresse, o contient une donnée (Info), o contient un pointeur, souvent nommé Suivant, qui contient l'adresse de l'élément suivant dans la liste, d'une variable, appelée, contenant l'adresse du premier élément de la liste chaînée. Le pointeur du dernier élément contient la valeur. Dans le cas d'une liste vide le pointeur de la tête contient la valeur. Une liste est définie par l'adresse de son premier élément. Avant d'écrire des algorithmes manipulant une liste chaînée, il est utile de montrer un schéma représentant graphiquement l'organisation des éléments de la liste chaînée. Exemple: Reprenons l'exemple du tableau paragraphe 1.1. page 1. La liste chaînée correspondante pourrait être : 3 @ : 2 10 1 @ :3 @ : 4 @ : 1 12 14 24 4 2 Le 1 er élément de la liste vaut 12 à l'adresse 3 (début de la liste chaînée) Le 2 e élément de la liste vaut 14 à l'adresse 4 (car le pointeur de la cellule d adresse 3 est égal à 4) Le 3 e élément de la liste vaut 10 à l'adresse 2 (car le pointeur de la cellule d adresse 4 est égal à 2) Le 4 e élément de la liste vaut 24 à l'adresse 1 (car le pointeur de la cellule d adresse 2 est égal à 1) Si a pour valeur 3 Si a pour valeur 2 ^.Info a pour valeur 12 ^.Info a pour valeur 10 ^.Suivant a pour valeur 4 ^.Suivant a pour valeur 1 2.3. Traitements de base d'utilisation d'une liste chaînée simple Il faut commencer par définir un type de variable pour chaque élément de la chaîne. En langage algorithmique ceci se fait comme suit : Type Liste = ^Element Type Element = Structure Info : variant Suivant : Liste Fin structure Variables Tete, : Liste Le type de Info dépend des valeurs contenues dans la liste : entier, chaîne de caractères, variant pour un type quelconque Chapitre 10 4 / 12

Les traitements des listes sont les suivants : Créer une liste. Ajouter un élément. Supprimer un élément. Modifier un élément. arcourir une liste. Rechercher une valeur dans une liste. 2.3.1 Créer une liste chaînée composée de 2 éléments de type chaîne de caractères Déclarations des types pour la liste : Type Liste = ^Element Type Element = Structure Info : chaîne de caractères Suivant : Liste Fin structure Algorithme CréationListe2Elements Tete, : Liste NombreElt : entier 1 Tete /* pour l'instant la liste est vide*/ 2 Allouer() /* réserve un espace mémoire pour le premier élément */ 3 Lire(^.Info) /* stocke dans l'info de l'élément pointé par la valeur saisie */ 4 ^.Suivant /* il n'y a pas d'élément suivant */ 5 Tete /* le pointeur Tete pointe maintenant sur */ /* Il faut maintenant ajouter le 2 e élément, ce qui revient à insérer un élément en tête de liste */ 6 Allouer() /* réserve un espace mémoire pour le second élément */ 7 Lire(^.Info) /* stocke dans l'info de l'élément pointé par la valeur saisie */ 8 ^.Suivant Tete /* élément inséré en tête de liste */ 9 Tete 1 Tete 2 Allouer() @ : 3 3 Lire(^.Info) @ : 3 remière Chapitre 10 5 / 12

4 ^.Suivant @ : 3 remière 5 Tete 3 @ : 3 remière 6 Allouer() 3 @ : 3 @ : 24 remière 7 Lire(^.Info) 3 @ : 3 @ : 24 remière chaîne 8 ^.Suivant Tete 3 @ :3 @ : 24 remière chaîne 3 9 Tete 24 @ :3 @ : 24 remière chaîne 3 Chapitre 10 6 / 12

2.3.2 Créer une liste chaînée composée de plusieurs éléments de type chaîne de caractères Déclarations des types pour la liste : Type Liste = ^Element Type Element = Structure Info : chaîne de caractères Suivant : Liste fin Structure our créer une liste chaînée contenant un nombre d'éléments à préciser par l'utilisateur il suffit d'introduire deux variables de type Entier NombreElt et Compteur de faire saisir la valeur de NombreElt par l'utilisateur dès le début du programme, d'écrire une boucle our Compteur allant de 1 à NombreElt comprenant les instructions 6, 7, 8 et 9. Algorithme CréationListeNombreConnu Tete, : Liste NombreElt : entier Compteur : entier Lire(NombreElt) Tete OUR Compteur DE 1 A NombreElt FAIRE Allouer() /* réserve un espace mémoire pour l élément à ajouter */ Lire(^.Info) /* stocke dans l'info de l'élément pointé par la valeur saisie */ ^.Suivant Tete /* élément inséré en tête de liste */ Tete /* le pointeur Tete pointe maintenant sur */ OUR our créer une liste chaînée contenant un nombre indéterminé d'éléments il faut : déclarer une variable de lecture de même type que celui de l information portée par la liste, déterminer et indiquer à l'utilisateur la valeur qu'il doit saisir pour annoncer qu'il n'y a plus d'autre élément à ajouter dans la chaîne (ici "XXX"), écrire une boucle Tant Que permettant d'exécuter les instructions 6, 7, 8 et 9 tant que la valeur saisie par l'utilisateur est différente de la valeur indiquant la fin de l'ajout d'élément dans la chaîne. Algorithme CréationListeNombreInconnu Tete, : Liste Valeur : chaîne de caractères Tete Lire (Valeur) TANT QUE que Valeur "XXX" FAIRE Allouer() /* réserve un espace mémoire pour l élément à ajouter */ ^.Info Valeur /* stocke dans l'info de l'élément pointé par la valeur saisie */ ^.Suivant Tete /* élément inséré en tête de liste */ Tete /* le pointeur Tete pointe maintenant sur */ Lire (Valeur) TANT QUE Chapitre 10 7 / 12

2.3.3. Afficher les éléments d'une liste chaînée Une liste chaînée simple ne peut être parcourue que du premier vers le dernier élément de la liste. 3 @ : 3 @ : 24 @ : 8 @ : 56 Ma première liste chainée 24 8 56 L'algorithme est donné sous forme d'une procédure qui reçoit la tête de liste en paramètre. rocedure AfficherListe (Entrée : Liste) /* Afficher les éléments d une liste chaînée passée en paramètre */ 1 Tete /* pointe sur le premier élément de la liste*/ /* On parcourt la liste tant que l'adresse de l'élément suivant n'est pas */ TANT QUE <> NIL FAIRE /* si la liste est vide Tete est à */ 2 Ecrire(^.Info) /* afficher la valeur contenue à l'adresse pointée par */ 3 ^.Suivant /* On passe à l'élément suivant */ TANT QUE 1 a pour valeur 3 2 "Ma" s affiche 3 prend pour valeur 24 2 "première" s affiche 3 prend pour valeur 8 2 "liste" s affiche 3 prend pour valeur 56 2 "chaînée" s affiche 3 prend pour valeur On s arrête puisque a pour valeur et que c est la condition d arrêt de la boucle Tant Que. 2.3.4. Rechercher une valeur donnée dans une liste chaînée ordonnée Dans cet exemple nous reprenons le cas de la liste chaînée contenant des éléments de type chaine de caractères, mais ce pourrait être tout autre type, selon celui déterminé à la création de la liste (rappelons que tous les éléments d'une liste chaînée doivent avoir le même type). La liste va être parcourue à partir de son premier élément (celui pointé par le pointeur de tête). Il a deux cas d arrêt : avoir trouvé la valeur de l'élément, avoir atteint la fin de la liste. L'algorithme est donné sous forme d'une procédure qui reçoit la tête de liste en paramètre. La valeur à chercher est lue dans la procédure. Chapitre 10 8 / 12

rocedure RechercherValeurListe (Entrée Tete : Liste, Val : variant) /* Rechercher si une valeur donnée en paramètre est présente dans la liste passée en paramètre */ Variables locales : Liste /* pointeur de parcours de la liste */ Trouve : booléen /* indicateur de succès de la recherche */ SI Tete <> ALORS /* la liste n'est pas vide on peut donc y chercher une valeur */ Tete Trouve Faux TANTQUE <> ET Non Trouve SI ^.Info = Val ALORS /* L'élément recherché est l'élément courant */ Trouve Vrai SINON /* L'élément courant n'est pas l'élément recherché */ ^.Suivant /* on passe à l'élément suivant dans la liste */ SI TANT QUE SI Trouve ALORS Ecrire (" La valeur ", Val, " est dans la liste") SINON Ecrire (" La valeur ", Val, " n'est pas dans la liste") SI SINON Ecrire("La liste est vide") SI 2.3.5. Supprimer le premier élément d'une liste chaînée Il y a deux actions, dans cet ordre, à réaliser : faire pointer la tête de liste sur le deuxième élément de la liste, libérer l'espace mémoire occupé par l'élément supprimé. Il est nécessaire de déclarer un pointeur local qui va pointer sur l'élément à supprimer, et permettre de libérer l'espace qu'il occupait. Tete 24 3 @ :3 @ :24 @ : 8 @ : 56 Ma première liste chainée 24 8 56 rocedure SupprimerremierElement (Entrée/Sortie Tete : Liste) /* Supprime le premier élément de la liste dont le pointeur de tête est passé en paramètre */ Variables locales : Liste /* pointeur sur l'élément à supprimer */ SI Tete <> ALORS /* la liste n'est pas vide on peut donc supprimer le premier élément */ Tete /* pointe sur le 1 er élément de la liste */ Tete ^.Suivant /* la tête de liste doit pointer sur le deuxième 'élément */ Desallouer() /* libération de l'espace mémoire qu'occupait le premier élément */ SINON Ecrire("La liste est vide") SI Chapitre 10 9 / 12

2.3.6. Supprimer d'une liste chaînée un élément portant une valeur donnée Il faut: traiter à part la suppression du premier élément car il faut modifier le pointeur de tête, trouver l'adresse de l'élément à supprimer, sauvegarder l'adresse rec de l'élément précédant l'élément pointé par pour connaître l'adresse de l'élément précédant l'élément à supprimer, puis faire pointer l'élément précédent sur l'élément suivant l'élément à supprimer, Libérer l'espace mémoire occupé par l'élément supprimé. L'exemple considère que l'on souhaite supprimer l'élément contenant la valeur "liste" de la liste cidessus. Tete rec 3 24 8 @ :3 @ : 24 @ :8 @ : 56 Ma première liste chaînée 24 56 8 56 Elément précédant celui à supprimer Elément à supprimer rocedure SupprimerElement (Entrée/Sortie Tete : Liste, Val : variant) /* Supprime l'élément dont la valeur est passée en paramètre */ Variables locales : Liste /* pointeur sur l'élément à supprimer */ rec : Liste /* pointeur sur l'élément précédant l'élément à supprimer */ Trouvé : Liste /* indique si l'élément à supprimer a été trouvé */ SI Tete <> ALORS /* la liste n'est pas vide on peut donc y chercher une valeur à supprimer */ SI Tete^.info = Val ALORS /* l'élément à supprimer est le premier */ Tete Tete Tete^Suivant Desallouer() SINON /* l'élément à supprimer n'est pas le premier */ Trouve Faux rec Tete /* pointeur précédent */ Tete^.Suivant /* pointeur courant */ TANTQUE <> ET Non Trouve SI ^.Info = Val ALORS /* L'élément recherché est l'élément courant */ Trouve Vrai SINON /* L'élément courant n'est pas l'élément cherché */ rec /* on garde la position du précédent */ ^ ^.Suivant /* on passe à l'élément suivant dans la liste */ SI TANT QUE SI Trouve ALORS rec^.suivant ^.Suivant /* on "saute" l'élément à supprimer "/ Desallouer() SINON Ecrire ("La valeur ", Val, " n'est pas dans la liste") SI SI SINON Ecrire("La liste est vide") SI Chapitre 10 10 / 12

2.4. Listes doublement chaînées Il existe aussi des liste chaînées, dites bidirectionnelles, qui peuvent être parcourues dans les deux sens, du 1 er élément au dernier et inversement. Une liste chaînée bidirectionnelle est composée : d'un ensemble de données, de l'ensemble des adresses des éléments de la liste, d'un ensemble de pointeurs Suivant associés chacun à un élément et qui contient l'adresse de l'élément suivant dans la liste, d'un ensemble de pointeurs recedent associés chacun à un élément et qui contient l'adresse de l'élément précédent dans la liste, du pointeur sur le premier élément Tete, et du pointeur sur le dernier élément, Queue, Type ListeDC = ^Element Type Element = Structure recedent : ListeDC Info : variant Suivant : ListeDC Fin Structure Le pointeur recedent du premier élément ainsi que le pointeur Suivant du dernier élément contiennent la valeur. Queue 3 5 @ : 3 @ : 4 @ : 2 @ : 5 3 4 2 12 14 10 24 4 2 5 A l'initialisation d'une liste doublement chaînée les pointeurs Tete et Queue contiennent la valeur. Afficher les éléments d'une liste doublement chaînée Il est possible de parcourir la liste doublement chaînée du premier élément vers le dernier. Le pointeur de parcours,, est initialisé avec l'adresse contenue dans Tete. Il prend les valeurs successives des pointeurs Suivant de chaque élément de la liste. Le parcours s'arrête lorsque le pointeur de parcours a la valeur. Cet algorithme est analogue à celui du parcours d'une liste simplement chaînée. rocedure AfficherListeAvant (Entrée Variables locales : ListeDC Tete / TANT QUE <> NIL FAIRE Ecrire(^.Info) ^.Suivant TANT QUE Tete : ListeDC) Chapitre 10 11 / 12

Il est possible de parcourir la liste doublement chaînée du dernier élément vers le premier. Le pointeur de parcours,, est initialisé avec l'adresse contenue dans Queue. Il prend les valeurs successives des pointeurs recedent de chaque élément de la liste. Le parcours s'arrête lorsque le pointeur de parcours a la valeur. rocedure AfficherListeArriere (Entrée Variables locales : ListeDC Queue TANT QUE <> NIL FAIRE Ecrire(^.Info) ^.recedent TANT QUE Queue : ListeDC) 2.5. Listes chaînées circulaires Une liste chaînée peut être circulaire, c'est à dire que le pointeur du dernier élément contient l'adresse du premier. Ci-dessous l'exemple d'une liste simplement chaînée circulaire : le dernier élément pointe sur le premier. 3 @ :3 @ :25 @ :8 @ :56 12 4 10 24 25 8 56 3 uis l'exemple d'une liste doublement chaînée circulaire. : Le dernier élément pointe sur le premier, et le premier élément pointe sur le dernier. Queue 3 56 @ :3 @ : 25 @ : 8 @ :56 56 3 25 8 12 14 10 24 25 8 56 3 WEBOGRAHIE http://www.siteduzero.com/tutoriel-3-36245-les-listes-chainees.html http://liris.cnrs.fr/pierre-antoine.champin/enseignement/algo/listes_chainees/ http://deptinfo.cnam.fr/enseignement/cyclea/sd/cours/structuress%e9quentielleschain%e9es.pdf http://pauillac.inria.fr/~maranget/x/421/poly/listes.html#toc2 http://wwwens.uqac.ca/~rebaine/8inf805/courslistespilesetfiles.pdf Chapitre 10 12 / 12