Pointeurs et listes chaînées Chap. 9

publicité
AP1 - Algorithmique
Chap. 9 Pointeurs et listes chaînées
IUT d'Amiens, département Informatique  année universitaire 2012/2013  AP1 Algo
Plan
A. Pointeurs
B. Allocation dynamique de mémoire
C. Liste chaînée
T2
Adresse mémoire et pointeur
●
●
Une variable est située
« quelque part » en mémoire,
à une adresse donnée
Pointeur : variable qui contient
l'adresse d'une autre variable
i
0x1234
ptr 0x1234
La mémoire
T3
Adresse mémoire et pointeur
●
●
Une variable est située
« quelque part » en mémoire,
à une adresse donnée
Pointeur : variable qui contient
l'adresse d'une autre variable
i
0x1234
ptr 0x1234
La mémoire
T4
Adresse mémoire et pointeur
●
●
●
Une variable est située
« quelque part » en mémoire,
à une adresse donnée
Pointeur : variable qui contient
l'adresse d'une autre variable
Déclaration d'un pointeur :
i
0x1234
ptr 0x1234
VARIABLES
...
ptr : pointeur d'entier
Mot clé
« pointeur »
Type de la variable
« pointée »
La mémoire
T5
Accès aux objets pointés : ↑
●
Pour accéder à la variable pointée par le pointeur, on
utilise le symbole « ↑ »
i
●
Exemple
120
0x1234
ptr vaut :
0x1234
ptr↑ vaut :
120
ptr 0x1234
La mémoire
T6
Exercice
●
Quel est l'effet de l'instruction suivante :
ptr↑ ← 7012
i
7012
120
0x1234
→ la variable i contient
la valeur 7012
ptr 0x1234
La mémoire
T7
Initialisation d'un pointeur
●
Comment initialiser un pointeur ?
–
Affecter le contenu d'un autre pointeur
●
–
Affecter la constante « adresse nulle »
●
–
ptr1 ← ptr2
ptr ← nil
Par allocation dynamique
●
Instruction nouveau
Attention : à la déclaration, un pointeur n'est pas initialisé et pointe donc n'importe où !!!
T8
Plan
A. Pointeurs
B. Allocation dynamique de mémoire
C. Liste chaînée
T9
Allocation dynamique
●
Exemple. Soit la variable ptr, de type pointeur d'entier
●
L'instruction nouveau(ptr) :
–
Réserve un emplacement mémoire de type entier
–
Place l'adresse de cet emplacement dans ptr
0xabcd
ptr 0xabcd
La mémoire
T10
Exercice
●
Qu'affiche cet algorithme ?
ALGORITHME exercice
VARIABLES
ptr1, ptr2 : pointeur de réel
DEBUT
nouveau(ptr1)
ptr1↑ ← 3.14
nouveau(ptr2)
ptr2↑ ← ptr1↑ + 2.0
nouveau(ptr1)
Afficher ptr1↑
Afficher ptr2↑
FIN
La mémoire
T11
Libération mémoire
●
Soit la variable ptr, de type pointeur d'entier
●
L'instruction libère(ptr) :
–
Restitue l'emplacement mémoire d'adresse ptr
–
Attention : ptr pointe désormais sur rien !!!
●
Il est conseillé de le mettre à nil
Il est du devoir du programmeur de
dés-allouer dès que possible avec
libère la mémoire allouée avec
nouveau
0xabcd
ptr 0xabcd
→ autant de « libère » que de
« nouveau »
La mémoire
T12
Plan
A. Pointeurs
B. Allocation dynamique de mémoire
C. Liste chaînée
T13
Retour sur les tableaux
●
●
Permettent de stocker un ensemble de données de même
type
Avantage :
–
●
Accès direct et simple à un élément du tableau par son
indice
Inconvénient
–
La taille est fixée à la déclaration et ne peut plus changer
ensuite
→ Les tableaux sont mal adaptés si le nombre de
données n'est pas connu a priori ou varie
→ Solution : les listes chaînées
T14
Notion de liste chainée
●
Une liste chaînée est une structure dynamique pour
laquelle chaque élément est constitué de deux
informations
–
Ses caractéristiques propres
●
–
Structure !
L'adresse de l'élément suivant
●
Pointeur !
T15
Exemple
●
Représentation d'une population d'étudiants
–
Caractérisés par leur prénom et leur moyenne d'AP1
Julie
17.8
Raoul
0xefgh
11.7
0xabcd
0xijkl
0xefgh
Sidonie
15.2
nil
0xijkl
La mémoire
T16
Formalisation algorithmique (I)
TYPE element = STRUCTURE
prenom : chaîne de car
moy_AP1 : réel
suivant : pointeur d'element
FINSTRUCTURE
Julie
17.8
Raoul
0xefgh
11.7
0xabcd
0xijkl
Est-ce suffisant ?
NON ! Il manque
l'adresse du premier
élément (ici : 0xabcd)
→ à placer dans un
pointeur d'element
0xefgh
Sidonie
15.2
nil
0xijkl
La mémoire
T17
Formalisation
algorithmique (II)
tete 0xabcd
ALGORITHME création liste
TYPE element = STRUCTURE
prenom : chaine de car
moy_AP1 : réel
suivant : pointeur d'element
FINSTRUCTURE
VARIABLES
tete, ptr : pointeur d'element
DEBUT
nouveau(tete)
…
Julie
ptr
0xabcd
La mémoire
T18
Formalisation
algorithmique (II)
ALGORITHME création liste
TYPE element = STRUCTURE
prenom : chaine de car
moy_AP1 : réel
suivant : pointeur d'element
FINSTRUCTURE
VARIABLES
tete, ptr : pointeur d'element
DEBUT
nouveau(tete)
tete↑.prenom ← Julie
tete↑.moy_AP1 ← 17.8
…
tete 0xabcd
Julie
ptr
17.8
0xabcd
La mémoire
T19
Formalisation
algorithmique (II)
ALGORITHME création liste
TYPE element = STRUCTURE
prenom : chaine de car
moy_AP1 : réel
suivant : pointeur d'element
FINSTRUCTURE
VARIABLES
tete, ptr : pointeur d'element
DEBUT
nouveau(tete)
tete↑.prenom ← Julie
tete↑.moy_AP1 ← 17.8
tete 0xabcd
Julie
ptr
17.8
0xefgh
0xabcd
0xefgh
nouveau(tete↑.suivant)
…
La mémoire
T20
ALGORITHME création liste
TYPE element = STRUCTURE
prenom : chaine de car
moy_AP1 : réel
suivant : pointeur d'element
FINSTRUCTURE
VARIABLES
tete, ptr : pointeur d'element
DEBUT
nouveau(tete)
tete↑.prenom ← Julie
tete↑.moy_AP1 ← 17.8
nouveau(tete↑.suivant)
ptr ← tete↑.suivant
ptr↑.prenom ← Raoul
ptr↑.moy_AP1 ← 11.7
…
Formalisation
algorithmique (II)
tete 0xabcd
Julie
ptr
0xefgh
17.8
0xefgh
0xabcd
Raoul
11.7
0xefgh
La mémoire
T21
ALGORITHME création liste
TYPE element = STRUCTURE
prenom : chaine de car
moy_AP1 : réel
suivant : pointeur d'element
FINSTRUCTURE
VARIABLES
tete, ptr : pointeur d'element
DEBUT
nouveau(tete)
tete↑.prenom ← Julie
tete↑.moy_AP1 ← 17.8
Formalisation
algorithmique (II)
tete 0xabcd
Julie
0xefgh
17.8
0xefgh
0xabcd
Raoul
11.7
0xijkl
nouveau(tete↑.suivant)
ptr ← tete↑.suivant
ptr↑.prenom ← Raoul
ptr↑.moy_AP1 ← 11.7
nouveau(ptr↑.suivant)
…
ptr
0xefgh
0xijkl
La mémoire
T22
ALGORITHME création liste
TYPE element = STRUCTURE
prenom : chaine de car
moy_AP1 : réel
suivant : pointeur d'element
FINSTRUCTURE
VARIABLES
tete, ptr : pointeur d'element
DEBUT
nouveau(tete)
tete↑.prenom ← Julie
tete↑.moy_AP1 ← 17.8
nouveau(tete↑.suivant)
ptr ← tete↑.suivant
ptr↑.prenom ← Raoul
ptr↑.moy_AP1 ← 11.7
nouveau(ptr↑.suivant)
…
Formalisation
algorithmique (II)
tete 0xabcd
Julie
ptr
0xefgh
17.8
0xefgh
0xabcd
Raoul
11.7
0xijkl
Sidonie
0xefgh
15.2
nil
0xijkl
La mémoire
T23
ALGORITHME parcours liste
Exercice
Donner l'algorithme d'affichage
des moyennes d'AP1 de tous les
étudiants
tete 0xabcd
Julie
TYPE element = STRUCTURE
prenom : chaine de car
moy_AP1 : réel
suivant : pointeur d'element
FINSTRUCTURE
VARIABLES
tete, ptr : pointeur d'element
DEBUT
ptr
17.8
0xefgh
0xabcd
Raoul
11.7
0xijkl
Sidonie
0xefgh
15.2
nil
0xijkl
FIN
T24
Téléchargement