Collections dynamiques Objectifs du cours A la fin du cours, vous serez capable de : • • • • • Définir et Distinguer les variables statique de dynamique. Définir et Distinguer le tas et la pile. Définir et Distinguer les collections dynamiques. Définir et Utiliser les classes auto référentielles. Mise au point de la classe Liste. Statique versus Dynamique Les déclarations classiques (entier, tableau, structure) génère des structures de données de tailles fixes ou Statiques. A l'opposé, les déclarations Dynamiques (instruction new en Java / C++) permettent de créer des données dont le nombre sera fonction des besoins au cours de l'exécution (leur nombre n'est pas figé à la compilation). La Pile (Stack) Lors de l’appel d’un module le contexte, les paramètres ainsi que les variables statique locales au module sont créés dans le pile. La pile est une zone mémoire ou l’on empile des données à la durée de vie temporaire. Comme une pile d’assiette on retire les éléments empilés dans l’ordre inverse ou ils ont été empilés. Adresses croissantes Data Data Data Data 4 3 2 1 Ordre empilage Le Tas (Heap) La création de variables dynamiques quand à elle ce fait sur le tas. Contrairement à la pile, on crée des données sur le Tas la ou il y à de la place, il peut y avoir des trous et il n’y à pas d’ordre pour le destruction. Le fait de créer une variable dynamique impose de la détruire avant de quitter le programme si on ne veut pas perdre de la mémoire en C++, Java lui possède un « gabage collector » !!! Collections dynamiques : Listes,arbres Les collections dynamique sont des structures de données qui vont permettre de gérer ces données (en quantité variable) à l'aide de méthodes de création, d'insertion, d'extraction, de recherche, de destruction, etc. Exemple de collections dynamiques : les liste chaînées, les piles, les FIFO, les arbres binaires. Chacune ayant ses propres caractéristiques. La librairie standard du C++ ou STL (Standard Template Library) ainsi que Java, propose un ensemble de collections intégrant ces structures ou permettant par héritage de les réaliser facilement. C'est la principale innovation de la dernière norme du C++, c'est aussi leurs supports natif qui a rendu Java populaire ! Liste simplement chaînée Une liste simplement chaînée est une collection linéaire d'objets (nœuds) relier entres-eux. Chaque nœud relié par des liens aux autres est appelée classe auto-référentielles. … ptrPremier 25 12 14 ptrDernier Chaque nœud est un objet dynamique, créé aux gré des besoins lors de l’exécution du programme. De ce fait, on à recours à des « pointeurs » pour accéder à ces objets créés sur le tas. Classes auto référentielles C'est une classe qui contient un pointeur membre vers un objet de même type. public class Node { private int value; private Node nextNode; public Node(int value) { this.value = value; Node -value: int +getValue(): int +setValue(value: int) +getNextNode(): Node +setNextNode(nextNode: Node) -nextNode this.nextNode = null; } etc ... } 25 12 Le pointeur initial ne fait pas parti d'une instance d'objet. Le pointeur de fin représente le pointeur nul (0 ou NULL). Collection : diagramme de classe Collection +length: int = 0 #pushFront(value: int) #pushBack(value: int) #popFront(): int #popBack(): int #getFront(): int #getBack(): int #remove(index: int) #get(index: int): int #update(index: int, value: int) +length(): int +toString(): String -firstNode Node -value: int -lastNode +getValue(): int +setValue(value: int) -nextNode +getNextNode(): Node +setNextNode(nextNode: Node) Allocation dynamique de données Node newNode; newNode = new Node(10); …… delete newNode; Attention : Ce n'est pas newNode qui est supprimé mais la donnée dynamique associé à cette l'adresse. Ceci n'existe pas en Java ! Erreur de programmation : Oublier en C++ de libérer la mémoire d'une donnée dynamique lorsqu'elle n'est plus utilisée est une cause de problème informatique grave : fuite de mémoire (memory leak). Utiliser une référence mémoire qui a été supprimée est une erreur grave. Remarque : Nous allons travailler avec des objets, mais bien sûr tout ce que nous allons voir peut être appliqué à des nœuds de type structure C / C++. Ajout d’un élément en fin de liste FisrtNode, lastNode ainsi que newNode sont des références sur des objets de classe Node ! De plus, on suppose la liste non vide. firstNode 25 lastNode newNode = new Node(12); 14 newNode 12 Ajout d’un élément (suite) lastNode.setNextNode(newNode); firstNode 25 14 lastNode newNode 12 Ajout d’un élément (fin) firstNode 25 14 lastNode newNode lastNode = newNode; 12 Ajout d’un élément en fin de liste protected void pushBack(int value) { Node newNode = new Node(value); // on vérifie si la liste n'est pas vide if (this.lastNode != null) { this.lastNode.setNextNode(n); this.lastNode = newNode; } else { this.firstNode = newNode; this.lastNode = newNode; } // on met à jour le nombre d'éléments de la liste this.length++; }
© Copyright 2025