Diagramme de classe d`une application

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++;
}