Si on a une variable dynamique qui contient elle-même une ou plusieurs variables pointeurs, on a une définition récursive d'une structure de données. On peut ainsi créer des piles, des listes, des arbres, des graphes, ...
type base = integer; pile = ^element; element = record valeur: base; suivant: pile; end;Remarque: c'est le seul cas en Pascal où l'on puisse utiliser un identificateur sans l'avoir préalablement défini. La figure 6.6 représente la structure d'une pile en cours d'exécution.
Figure 6.6: structure de la pile pairs lors d'une exécution
On obtient alors le programme suivant :
program piles2; type base = integer; pile=^element; element = record valeur : base; suivant : pile; end; var pairs, impairs : pile; x : integer; procedure initpile(var p:pile); begin p:=nil; end; function pilevide(p:pile):boolean; begin pilevide:=(p=nil); end; procedure empiler(var p:pile; e : base); var paux : pile; begin new(paux); paux^.valeur:=e; paux^.suivant:=p; p:=paux; end; procedure depiler(var p: pile; var e : base); var paux : pile; begin if (pilevide(p)) then writeln('impossible de depiler car pile vide') else begin e:=p^.valeur; paux:=p^.suivant; dispose(p); p:=paux; end; end; begin initpile(pairs); initpile(impairs); writeln('Entrez des nombres entiers, pour arreter entrez 0'); readln(x); while (x<>0) do begin if (x mod 2 = 0) then empiler(pairs,x) else empiler(impairs,x); readln(x); end; writeln('Les nombres pairs que vous avez entres sont '); while not(pilevide(pairs)) do begin depiler(pairs, x); writeln(x); end; writeln('Les nombres impairs que vous avez entres sont '); while not(pilevide(impairs)) do begin depiler(impairs, x); writeln(x); end; end.Il est intéressant de remarquer que dans les trois définitions successives du type pile (voir les paragraphes 5.3 et 6.3.2), le programme principal de l'application pairs-impairs reste inchangé. Le type pile est ce qu'on appelle un .