www.facultedegenie.net |
|
* Guest-Book * f = w |
Informatique : PASCAL (Chapitre IX) POINTEURS This
text copyright = www.ziade.net (IX.1) Variables statiques, Variables dynamiques (IX.1.a) Variables statiques Une variable est statique quand sa taille totale (maximale) est fixée à la compilation. En particulier, les tableaux sont des variables statiques en Pascal. (IX.1.b) Variables dynamiques Une variable est dynamique quand sa taille totale (maximale) n'est pas fixée à la compilation. D'une certaine façon un fichier ressemble à une variable dynamique. Il est possible en Pascal de créer des variables (de type pointeurs) dynamiquement (c.-à-d. pendant l'exécution, donc après la compilation). Dans toute la suite de ce chapitre nous allons volontairement nous limiter aux listes chaînées simples. (IX.2) Déclaration d'une Liste chaînée simple Voici un exemple typique qui crée un type pointeur T_PTR, et qui déclare une variable pointeur PTR. TYPE T_PTR = ^T_REC ; T_REC = RECORD NOM, PRENOM : STRING[25] ; {… : … ; } MOYENNE : REAL ; SUIVANT : T_PTR ; END ; {fin du record} VAR PTR : T_PTR ; Attention: La variable pointeur
PTR contient seulement une adresse mémoire (c.-à-d. un
nombre). De même le pointeur SUIVANT
contient seulement l'adresse du pointeur qui est le
suivant de PTR. PTR1^.SUIVANT := PTR2 ; PTR2^.SUIVANT := PTR3 ; { … ; } Mais le programmeur ne choisit
pas les adresses mémoires (qui dépendent de la
disponibilité). (IX.3) Création d'une Liste chaînée simple Les pointeurs sont créés de façon dynamique pendant l'exécution. L'instruction NEW(PTR) crée un nouveau pointeur c.-à-d. réserve un nouvel espace mémoire (qui était initialement libre). Exemple: NEW(PTR1TETE) ; Le mot réservé NIL indique que le pointeur ne contient pas d'adresse, donc le pointeur pointe sur rien. Par exemple pour dire que la liste PTR1TETE est vide il faut écrire: PTR1TETE := NIL ; (IX.4) Parcours d'une Liste chaînée simple (IX.4.a) Exemple typique de parcours itératif: PROCEDURE PARCOURS( PTR1TETE : T_PTR ) ; VAR PTR :T_PTR ; BEGIN PTR := PTR1TETE ; WHILE PTR<>NIL DO BEGIN WRITELN( PTR^.NOM, '_' , PTR^.PRENOM, '_' , PTR^.MOYENNE ) ; PTR := PTR^.SUIVANT ; END ; {du WHILE} END ; (IX.4.b) Exemple typique de parcours récursif: PROCEDURE PARCOURS_RECURSIF( VAR PTR : T_PTR ) ; BEGIN {* Cette procédure doit être utilisée en écrivant: PARCOURS_RECURSIF(PTR1TETE); … *} IF PTR<>NIL THEN BEGIN WRITELN( PTR^.NOM, '_' , PTR^.PRENOM, '_' , PTR^.MOYENNE ) ; PARCOURS_RECURSIF( PTR^.SUIVANT ) ; END ; {du IF} END ; (IX.5) Ajouter un élément à une Liste chaînée simple (IX.5.a) Insertion du nouvel élément au début de la Liste chaînée: PROCEDURE INSERE_DEBUT( VAR PTR1TETE : T_PTR ) ; VAR PTR :T_PTR ; BEGIN NEW(PTR) ; PTR^.NOM := '…' ; PTR^.PRENOM := '…' ; PTR^.MOYENNE := 50 ; {* exemple *} PTR^.SUIVANT := PTR1TETE ; PTR1TETE := PTR ; END ; (IX.5.b) Insertion d'un nouvel élément à la fin de la Liste chaînée: PROCEDURE INSERE_FIN( VAR PTR : T_PTR ) ; BEGIN {* Cette procédure doit être utilisée en écrivant: INSERE_FIN(PTR1TETE); … *} IF PTR1TETE=NIL THEN INSERE_DEBUT( PTR ) ELSE INSERE_FIN( PTR^.SUIVANT ) ; END ; (IX.5.c) Exemple d'insertion d'un nouvel élément à l'intérieur de la Liste chaînée: PROCEDURE INSERE_INTERIEUR( VAR PTR : T_PTR ) ; VAR PTR2NOUVEAU :T_PTR ; BEGIN {* Cette procédure doit être utilisée en écrivant: INSERE_INTERIEUR(PTR1TETE); … *} IF PTR^.NOM > 'TOTO' THEN {* insertion de PTR2NOUVEAU après celui de 'TOTO' *} BEGIN NEW(PTR2NOUVEAU) ; PTR2NOUVEAU ^.NOM := '…' ; {* etc. *} PTR2NOUVEAU ^.SUIVANT := PTR ; PTR := PTR2NOUVEAU ; END ELSE INSERE_INTERIEUR( PTR^.SUIVANT ) ; END ; (IX.6) Enlever un élément à une Liste chaînée simple ... [Sorry la suite n'est pas disponible sur internet.] (II) Erreurs ou Limites des Calculs Numériques et informatiques ***** (III) Types, Opérateurs, Fonctions et Procédures prédéfinis (IV) Partie Déclarative d'un programme (VI) Affectations, Tests, Boucles (VII) Fonctions, Procédures, Récursivité |