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