Programmation algorithmique/Listes doublement chaînées
Apparence
Une liste doublement chaînée permet de gagner en complexité sur l'insertion et la suppression par rapport à la liste simplement chaînée, en plus de permettre un parcours des elements à l'envers. Mais on utilise un pointeur supplémentaire par élément. Il faut donc maintenir cohérentes deux fois plus de variables que dans une liste simplement chaînée.
ELEMENT : ENREGISTREMENT CLEF SUIVANT : ELEMENT PRECEDENT : ELEMENT FIN ENREGISTREMENT
LISTE : ENREGISTREMENT TETE : ELEMENT QUEUE : ELEMENT FIN ENREGISTREMENT
Recherche dans une liste chaînée
[modifier | modifier le wikicode]Recherche d'un élément ayant une clé CLEF dans une liste
[modifier | modifier le wikicode](Idem listes simplement chaînées) Complexité : O(N)
FONCTION DOUBLE_LISTE:RECHERCHER(LISTE, CLEF) ELEMENT := LISTE.TETE TANT QUE ELEMENT != NIL ET ELEMENT.CLEF != CLEF ELEMENT := ELEMENT.SUIVANT FIN TANT QUE' RETOURNER ELEMENT FIN FONCTION
Recherche de l'élément suivant un élément ELEMENT dans une liste
[modifier | modifier le wikicode](Idem listes simplement chaînées) Complexité : O(1)
FONCTION DOUBLE_LISTE:SUIVANT(LISTE, ELEMENT) RETOURNER ELEMENT.SUIVANT FIN FONCTION
Recherche de l'élément précédent un élément ELEMENT dans une liste
[modifier | modifier le wikicode]Complexité : O(1)
FONCTION DOUBLE_LISTE:PRECEDENT(LISTE, ELEMENT) RETOURNER ELEMENT.PRECEDENT FIN FONCTION
Insertion
[modifier | modifier le wikicode]Insertion d'un élément NOUVEL_ELEMENT en début de liste
[modifier | modifier le wikicode]Complexité O(1)
FONCTION DOUBLE_LISTE:INSERER_DEVANT(LISTE, NOUVEL_ELEMENT) ELEMENT := LISTE.TETE LISTE.TETE := NOUVEL_ELEMENT NOUVEL_ELEMENT.SUIVANT = ELEMENT NOUVEL_ELEMENT.PRECEDENT = NIL SI LISTE.QUEUE = NIL ALORS LISTE.QUEUE := NOUVEL_ELEMENT FIN SI FIN FONCTION
Insertion d'un élément NOUVEL_ELEMENT dans une liste après un élément ELEMENT
[modifier | modifier le wikicode]Complexité : O(1)
FONCTION DOUBLE_LISTE:INSERER_APRES(LISTE, ELEMENT, NOUVEL_ELEMENT) SI LISTE.TETE = NIL ALORS LISTE.TETE := NOUVEL_ELEMENT LISTE.QUEUE := NOUVEL_ELEMENT NOUVEL_ELEMENT.PRECEDENT := NIL NOUVEL_ELEMENT.SUIVANT = NIL SINON NOUVEL_ELEMENT.PRECEDENT := ELEMENT NOUVEL_ELEMENT.SUIVANT := ELEMENT.SUIVANT SI ELEMENT.SUIVANT != NIL ALORS ELEMENT.SUIVANT.PRECEDENT := NOUVEL_ELEMENT SINON LISTE.QUEUE := NOUVEL_ELEMENT FIN SI ELEMENT.SUIVANT := NOUVEL_ELEMENT FIN SI FIN FONCTION
Insertion d'un élément NOUVEL_ELEMENT dans une liste avant un élément ELEMENT
[modifier | modifier le wikicode]Complexité : O(1)
FONCTION DOUBLE_LISTE:INSERER_AVANT(LISTE, ELEMENT, NOUVEL_ELEMENT) SI LISTE.TETE = NIL ALORS LISTE.TETE := NOUVEL_ELEMENT LISTE.QUEUE := NOUVEL_ELEMENT NOUVEL_ELEMENT.SUIVANT := NIL NOUVEL_ELEMENT.PRECEDENT := NIL SINON NOUVEL_ELEMENT.SUIVANT := ELEMENT NOUVEL_ELEMENT.PRECEDENT := ELEMENT.PRECEDENT SI ELEMENT.PRECEDENT != NIL ALORS ELEMENT.PRECEDENT.SUIVANT := NOUVEL_ELEMENT SINON LISTE.TETE := NOUVEL_ELEMENT FIN SI ELEMENT.PRECEDENT := NOUVEL_ELEMENT FIN SI FIN FONCTION
Suppression
[modifier | modifier le wikicode]Suppression d'un élément ELEMENT_SUPPRIME d'une liste
[modifier | modifier le wikicode]Complexité : O(1)
FONCTION DOUBLE_LISTE:SUPPRIMER(LISTE, ELEMENT_SUPPRIME) SI ELEMENT_SUPPRIME.PRECEDENT != NULL ALORS ELEMENT_SUPPRIME.PRECEDENT.SUIVANT := ELEMENT_SUPPRIME.SUIVANT SINON LISTE.TETE := ELEMENT_SUPPRIME.SUIVANT FIN SI SI ELEMENT_SUPPRIME.SUIVANT != NIL ALORS ELEMENT_SUPPRIME.SUIVANT.PRECEDENT := ELEMENT_SUPPRIME.PRECEDENT SINON LISTE.QUEUE := ELEMENT_SUPPRIME.PRECEDENT FIN SI FIN FONCTION