Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Structure de Données
Pointeur et Liste
Marie Pelleau
marie.pelleau@univ-cotedazur.fr
Semestre 3
Itérations 1 / 56
Plan Notes
1 Pointeur
2 Liste
Liste simplement chaı̂née
Liste doublement chaı̂née
3 Implémentation
Itérations 2 / 56
Pointeur
Rappels Notes
Variable
Une variable sert à mémoriser de l’information
Ce qui est mis dans une variable est en fait mis dans une partie de la
mémoire
Structures de données
Permettent de gérer et d’organiser des données
Sont définies à partir d’un ensemble d’opérations qu’elles peuvent
effectuer sur les données
Ne regroupent pas nécessairement des objets du même type
Itérations 3 / 56
Pointeur
Itérations 4 / 56
Pointeur
Inconvénient
C’est compliqué
quand on veut supprimer un objet (que devient son indice ?)
quand on veut insérer un objet (que devient son indice ?)
quand on veut ajouter un objet (les tableaux doivent être agrandis)
Itérations 5 / 56
Pointeur
C l a s s MonObjet { . . . }
MonObjet o b j ; // on dé f i n i t un a u t r e o b j e t
o b j = mobj1 ;
o b j . s e t V a l u e ( 8 ) ; // c h a n g e une donn é e de mobj1
o b j = mobj2 ;
o b j . s e t V a l u e ( 1 2 ) ; // c h a n g e une donn é e de mobj2
obj change indirectement mobj1 et mobj2, c’est une indirection
Itérations 6 / 56
Pointeur
Pointeur Notes
Itérations 7 / 56
Pointeur
Pointeur Notes
Itérations 8 / 56
Liste
Liste Notes
Itérations 9 / 56
Liste
Liste Notes
Itérations 10 / 56
Liste Liste simplement chaı̂née
Représentation
L d1 d2 d3
e1 e2 e3
correspondant au suivant
premier(L) = e1
donnée(e1) = d1, suivant(e1) = e2
donnée(e2) = d2, suivant(e2) = e3
donnée(e3) = d3, suivant(e3) = nil
Itérations 11 / 56
Liste Notes
Itérations 12 / 56
Liste Liste simplement chaı̂née
Incovénient
Certaines opérations peuvent devenir coûteuses comme la recherche
d’un élément contenant une certaine donnée
Pas de recherche dichotomique dans une liste : on ne peut pas
atteindre le ième élément sans parcourir
Itérations 13 / 56
Newell et Simon ont obtenu l’ACM Turing Award en 1975 pour avoir
“made basic contributions to artificial intelligence, the psychology of
human cognition, and list processing”
Itérations 14 / 56
Liste Liste simplement chaı̂née
Itérations 15 / 56
Liste Notes
i n i t L i s t e (L) {
p r e m i e r ( L ) <− n i l
}
Initialisation de L
L
Itérations 16 / 56
Liste Liste simplement chaı̂née
Liste Notes
Itérations 17 / 56
Liste Notes
Principes
Le premier de la liste deviendra elt
Mais où est l’ancien premier ? Il devient le suivant de elt
Attention
L’ordre de mise à jour est important ! On ne doit pas perdre le premier
Le suivant de elt est mis à jour
Puis le premier de la liste
Itérations 18 / 56
Liste Liste simplement chaı̂née
Liste Notes
Ajout de e7
e7
d7
L d1 d2 d3
e1 e2 e3
Itérations 19 / 56
Liste Notes
Ajout de e3
L d1 d2 d3
e1 e2 e3
Itérations 20 / 56
Liste Liste simplement chaı̂née
Liste Notes
Principes
Le suivant de elt devient le suivant de p
Le suivant de p devient elt
Attention
L’ordre de mise à jour est important !
Itérations 21 / 56
Liste Notes
Insertion de e7 après e2
e7
d7
L d1 d2 d3
e1 e2 e3
Itérations 22 / 56
Liste Liste simplement chaı̂née
Liste Notes
Insertion de e2 après e3
L d1 d2 d3
e1 e2 e3
Itérations 23 / 56
Liste Notes
Insertion de e1 après e3
L d1 d2 d3
e1 e2 e3
Itérations 24 / 56
Liste Liste simplement chaı̂née
Liste Notes
Suppression de e2
L d1 d2 d3
e1 e2 e3
Suppression de e1
L d1 d2 d3
e1 e2 e3
Itérations 25 / 56
Liste Notes
Principe
Le suivant du précédent devient le suivant de elt
Itérations 26 / 56
Liste Liste simplement chaı̂née
Liste Notes
Suppression d’un élément
supprime ( e l t , p , L) {
// e l t e s t d a n s L , p s o n p r é c é d e n t
s i ( premier (L) = e l t ) {
p r e m i e r ( L ) <− s u i v a n t ( e l t )
} sinon {
s i ( suivant (p) = elt ) {
s u i v a n t ( p ) <− s u i v a n t ( e l t )
}
}
}
L d1 d2 d3
e1 e2 e3
Itérations 27 / 56
Plan Notes
1 Pointeur
2 Liste
Liste simplement chaı̂née
Liste doublement chaı̂née
3 Implémentation
Itérations 28 / 56
Liste Liste doublement chaı̂née
Liste Notes
Itérations 29 / 56
Représentation
L
d1 d2 d3
e1 e2 e3
lien
premier(L) = e1
donnée(e1) = d1, suivant(e1) = e2, précédent(e1) = nil
donnée(e2) = d2, suivant(e2) = e3, précédent(e2) = e1
donnée(e3) = d3, suivant(e3) = nil , précédent(e3) = e2
Itérations 30 / 56
Liste Liste doublement chaı̂née
Liste Notes
Itérations 31 / 56
Liste Notes
Principes
Le suivant de elt est le premier
Le premier de la liste deviendra elt
Attention
L’ordre de mise à jour est important !
Itérations 32 / 56
Liste Liste doublement chaı̂née
Liste Notes
Ajout d’un élément
ajouteAuD é b u t ( e l t , LD) {
// e l t n ' e s t p a s d a n s LD
s u i v a n t ( e l t ) <− p r e m i e r (LD)
p r é c é d e n t ( e l t ) <− n i l
p r é c é d e n t ( p r e m i e r (LD) ) <− e l t
p r e m i e r (LD) <− e l t
}
Ajout de e7
e7
d7
d1 d2 d3
e1 e2 e3
L
Itérations 33 / 56
Liste Notes
Principes
Le suivant de elt devient le suivant de p
Le précédent de elt est p
Le suivant de p devient elt
Le précédent de suivant (p) devient elt
Sont modifiés : suivant ( elt ), précédent( elt ), suivant (p),
précédent( suivant (p))
Itérations 34 / 56
Liste Liste doublement chaı̂née
Liste Notes
Insertion d’un élément
i n s è r e A p r è s ( e l t , p , LD) {
// e l t n ' e s t p a s d a n s LD , p e s t d a n s LD
s u i v a n t ( e l t ) <− s u i v a n t ( p )
p r é c é d e n t ( e l t ) <− p
p r é c é d e n t ( s u i v a n t ( p ) ) <− e l t
s u i v a n t ( p ) <− e l t
}
Insertion de e7 après e2
e7
Mauvais code !
d7
L ?
Pourquoi
d1 d2 d3
e1 e2 e3
Itérations 35 / 56
Liste Notes
Insertion d’un élément
i n s è r e A p r è s ( e l t , p , LD) {
// e l t n ' e s t p a s d a n s LD , p e s t d a n s LD
s u i v a n t ( e l t ) <− s u i v a n t ( p )
p r é c é d e n t ( e l t ) <− p
p r é c é d e n t ( s u i v a n t ( p ) ) <− e l t
s u i v a n t ( p ) <− e l t
}
7Insertion de e7 après e3 ?
e7
d7
L
d1 d2 d3
e1 e2 e3
Itérations 36 / 56
Liste Liste doublement chaı̂née
Liste Notes
Itérations 37 / 56
Liste Notes
Suppression d’un élément
On supprime un élément de la liste
On n’a pas besoin du précédent !
Le premier peut changer !
Principes
Le suivant du précédent devient le suivant de elt
Le précédent du suivant devient le précédent de elt
Suppression de e2
L
d1 d2 d3
e1 e2 e3
Itérations 38 / 56
Liste Liste doublement chaı̂née
Liste Notes
Itérations 39 / 56
Implémentation
Plan Notes
1 Pointeur
2 Liste
Liste simplement chaı̂née
Liste doublement chaı̂née
3 Implémentation
Itérations 40 / 56
Implémentation
Implémentation Notes
Par un tableau
À l’aide de pointeur
Itérations 41 / 56
Implémentation
Exemple
L 2 3 1 5 4
S 5 3 1 0 4
P 3 0 2 5 1
Itérations 42 / 56
Implémentation
Pointeur Notes
Itérations 43 / 56
Implémentation
Une variable est destinée à contenir une valeur du type avec lequel
elle est déclarée
Physiquement cette valeur se situe en mémoire
61 62 63 64 65
int x
61 62 63 64 65
x
x = 10 61 62 63 64 65
10
x
Itérations 44 / 56
Implémentation
61 62 63 64 65
int x
x
61 62 63 64 65
x = 10 10
x
10 ?
x px
px = &x; // adresse de x
61 62 63 64 65 95 96 97 98
10 62
x px
Itérations 45 / 56
Implémentation
Si px contient l’adresse de x
Alors ∗px contient la valeur qui se trouve à l’adresse de x, donc la
valeur de x
Si je change la valeur qui se trouve à l’adresse de x, alors je change la
valeur de x
Itérations 46 / 56
Implémentation
Une référence est une valeur qui permet l’accès en lecture et/ou
écriture à une donnée située soit en mémoire principale soit ailleurs
Une référence n’est pas la donnée elle-même mais seulement une
information de localisation
Ressemble à quelque chose de connu, non ?
Implémentation
En C/C++
Pointeurs typés mais type changeable
MyObject a, b;
MyObject∗ obj;
obj = &a; si on modifie obj alors on modifie a
obj = &b; si on modifie obj alors on modifie b
myFonction(MyObject∗ obj) obj est passé en entrée/sortie
myFonction(MyObject obj) obj est passé en entrée
Itérations 48 / 56
Implémentation
Représentation
L
d1 d2 d3
e1 e2 e3
lien
ListeElement
suivant : pointeur vers ListeElement
précédent : pointeur vers ListeElement
donnée : pointeur vers l’objet
Liste
premier : pointeur vers ListeElement
Itérations 49 / 56
Implémentation
class ListElt {
ListElt suiv
ListElt prec
MaClasseDonnee data
L i s t E l t () {
suiv = nil
prec = n i l
data = n u l l
}
}
Itérations 50 / 56
Implémentation
class List {
ListElt premier
List () {
premier = n i l
}
}
Itérations 51 / 56
Plan Notes
1 Pointeur
2 Liste
Liste simplement chaı̂née
Liste doublement chaı̂née
3 Implémentation
Itérations 52 / 56
Exemple d’utilisation de listes
Pile Notes
Liste simplement chaı̂née : opérations
initListe (L)
nombreElements(L)
premier(L)
ajouteAuDébut(elt, L)
insèreAprès( elt , p, L)
supprime( elt , p, L)
Pile Notes
Itérations 54 / 56
Exemple d’utilisation de listes
File Notes
Liste simplement chaı̂née : opérations
initListe (L)
nombreElements(L)
premier(L)
ajouteEnFin( elt , L)
insèreAprès( elt , p, L)
supprime( elt , p, L)
File Notes
Itérations 56 / 56