-- gestion de base des listes simple (1 chainage) with Unchecked_Deallocation ; with Text_IO ; use Text_IO ; -- pour les entrees/sorties procedure liste is package Int_Io is new Integer_IO (INTEGER); use Int_Io; type ELT is new INTEGER ; type CELLULE ; type LISTE is access CELLULE ; type CELLULE is record contenu : ELT ; suiv : LISTE ; end record; procedure free is new Unchecked_Deallocation (CELLULE, LISTE); -- cree dynamiquement une cellule function creation return LISTE is cel : LISTE := NULL ; begin cel := new CELLULE ; cel.contenu := 0 ; cel.suiv := NULL ; return(cel) ; end creation ; -- passe a l'elt suivant function elt_suivant(lst : IN LISTE) return LISTE is begin return(lst.suiv) ; end elt_suivant ; -- retourne le contenu de la cellule function elt_courant(lst : IN LISTE) return ELT is begin return(lst.contenu) ; end elt_courant ; -- retourne V si la liste est vide et F sinon function liste_vide(lst : in LISTE) return BOOLEAN is begin if (lst=NULL) then return(TRUE) ; else return(FALSE) ; end if ; end liste_vide ; -- ajoute un elt a la suite et change d'elt courant procedure ajout_en_debut (lst : in out LISTE ; e : in ELT) is cell : LISTE := NULL ; begin if liste_vide(lst) then lst := creation ; else cell := creation ; cell.suiv := lst ; -- on perd la position cell.contenu := e ; lst := cell ; end if ; end ajout_en_debut ; -- retrait du dernier elt procedure retrait_du_debut (lst : in out LISTE) is l2 : LISTE := NULL ; begin l2 := elt_suivant(lst) ; free(lst) ; lst := l2 ; end retrait_du_debut ; -- programme principal i : integer ; e : ELT := 0 ; premier : LISTE := NULL ; begin new_line ; for i in 1..10 loop put(i) ; new_line ; ajout_en_debut(premier, e) ; end loop ; for i in 1..10 loop put(i) ; new_line ; retrait_du_debut(premier) ; end loop ; new_line ; end liste ;