POINTEURS


Un pointeur est une variable qui stocke l'adresse (c.a.d la position en memoire) d'une variable.

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers. On suppose connaitre pour chacun l'adresse du suivant :

liste

si l'on veut inserer une valeur dans la liste, les modifications a apporter sont minimes :

insertion

Contrairement a l'insertion dans un tableau, il est inutile de decaler les termes suivants. Pour connaitre la liste, il suffit de connaitre l'adresse du premier terme.

Pour representer un arbre, il suffit pour chaque element de connaitre l'adresse de chaque fils :

arbre

Rq : si le nombre de fils n'est pas constant, on a interet a stocker uniquement le fils aine, ainsi que le frere suivant.

LES POINTEURS EN PASCAL

En pascal, on utilise les pointeurs pour representer ces objets. La declaration se fait de la maniere suivante :

TYPE pointeur=^type_de_la_variable_pointee

ex : TYPE tpoint=^tval;  (* pointe sur des TVAL *)
          tval=record
                 valeur:integer;
                 suivant:tpoint
               end;
     VAR p1,p2:tpoint;
Dans cet exemple, les variables de type TVAL contiendront un entier et l'adresse de la suivante (liste chainee vue plus haut).

Contrairement aux tableaux, il n'est pas necessaire de prevoir le nombre de variables pointees a l'avance. C'est "l'allocation dynamique de memoire" : on reserve la place pour chaque variable en cours d'execution du programme, par la commande NEW(nom_variable). On recupere la place, si la variable est devenue inutile, par DISPOSE(nom_variable).

P1 contient donc une adresse d'une variable de type TVAL. Cette variable sera P1^ (c.a.d pointee par P1). On la "remplit" donc par des affectations du type :

P1^.valeur:=15; P1^.suivant:=P2;

Examinons un programme qui lit puis affiche une liste chainee d'entiers :

  program liste(input,output);
  TYPE tpoint=^tval;
       tval=record
              valeur:integer;
              suivant:tpoint
            end;
  VAR prem,precedent,point:tpoint;
      i,n:integer;
  begin
    write('combien d''elements comporte votre liste ?');
    readln(n);
    new(prem);    (* le 1er est particulier : si on le perd, on perd la liste *) 
    write('1ere valeur ? ');
    readln(prem^.valeur);   (* lecture de l'enregistrement VALEUR
             de la variable d'adresse (pointee par) PREM *)
    precedent:=prem;
    for i:=2 to n do begin
      new(point);      (* creation d'une nouvelle variable *)
      write(i,'ieme valeur ? ');
      readln(point^.valeur);
      precedent^.suivant:=point;   (* mise a jour du chainage *)
      precedent:=point   (*se preparer pour la prochaine boucle*)
    end;
    precedent^.suivant:=NIL; 
  (* NIL signifie "rien" car 0 est un entier, non une adresse *)
    point:=prem;  (* heureusement, on se souvient du premier *)
    for i:=1 to n do begin
      writeln(point^.valeur);
      point:=point^.suivant  (* pour la prochaine boucle *)
    end
  end.


EXERCICE (pointeurs) modifier ce programme pour qu'il permette de rajouter ou supprimer des elements. Decomposez le en routines.