23/03/05SE Info2 - S. L'haire UNIGE1 TP 7 PROCEDURE Inserer(VAR a, crt : AgendaPtr; j, h : INTEGER; IN s : Chaine); VAR nouveau, temp : AgendaPtr; BEGIN NEW(nouveau);nouveau.jour := j;nouveau.heure := h; nouveau.sujet := s;nouveau.suivant := NIL; crt:= nouveau; IF a = NIL THEN a := nouveau; ELSIF (a.jour > j) OR ((a.jour = j) & (a.heure > h)) THEN nouveau.suivant := a; a := nouveau;
23/03/05SE Info2 - S. L'haire UNIGE2 TP 7 suite ELSE (*insertion en ordre*) temp := a; WHILE (temp.suivant # NIL) & ((nouveau.jour > temp.suivant.jour) OR ((nouveau.jour = temp.suivant.jour) & (nouveau.heure > temp.suivant.heure))) DO temp := temp.suivant; END; (*insertion au point d'insertion*) nouveau.suivant := temp.suivant; temp.suivant := nouveau; END; END Inserer;
23/03/05SE Info2 - S. L'haire UNIGE3 TP 7 suite PROCEDURE GetPrecedent(tete, crt : AgendaPtr; VAR p : AgendaPtr); BEGIN p := tete; IF p = crt THEN p := NIL; ELSE WHILE (p.suivant # NIL) & (p.suivant # crt) DO p := p.suivant; END; END GetPrecedent;
23/03/05SE Info2 - S. L'haire UNIGE4 TP 7 suite PROCEDURE DetruireCrt(VAR a, crt : AgendaPtr): BOOLEAN; VAR prec : AgendaPtr; BEGIN IF a # NIL THEN GetPrecedent(a, crt, prec); IF prec = NIL THEN a := a.suivant; crt := a; ELSE prec.suivant := crt.suivant; crt := prec; END; RETURN TRUE ELSE RETURN FALSE END; END DetruireCrt;
23/03/05SE Info2 - S. L'haire UNIGE5 Liste doublement chaînée ListeDoublePtr = POINTER TO ListeDouble; ListeDouble = RECORD cle : blabla prec, suivant : ListeDoublePtr; END;
23/03/05SE Info2 - S. L'haire UNIGE6 Enregistrement auxiliaire pour gérer liste tete queue courant MaListe = RECORD tete, queue courant: ListeDoublePtr; taille : INTEGER; END; taille
23/03/05SE Info2 - S. L'haire UNIGE7 Insertion La liste doit être initialisée tous les pointeurs à NIL (créer procédure propre) Ne pas oublier qu'il y a des pointeurs dans les 2 sens Toujours penser à tete, queue et courant de l'enr. auxiliaire
23/03/05SE Info2 - S. L'haire UNIGE8 Insertion en tête NEW(el); el.cle:= … el.precedent:= NIL; el.suivant:= l.tete; IF l.taille = 0 THEN l.queue:= el ELSE l.tete.precedent:= el END; l.tete:= el; INC(l.taille); l.courant := …
23/03/05SE Info2 - S. L'haire UNIGE9 Insertion en queue NEW(el); el.cle:= i; el.precedent:= l.queue; el.suivant:= NIL; IF l.taille = 0 THEN l.tete:= el ELSE l.queue.suivant:= el END; l.queue:= el; INC( l.taille); l.courant :=…
23/03/05SE Info2 - S. L'haire UNIGE10 Insertion avant courant NEW(el); el.cle:= i; el.suivant:= NIL; el.precedent:= NIL; IF (l.taille = 0) OR (l.courant = l.tete) THEN InsererEnTete( l, i) ELSE el.suivant:= l.courant; el.precedent:= l.courant.precedent; l.courant.precedent.suivant := el; l.courant.precedent := el; INC( l.taille) END;
23/03/05SE Info2 - S. L'haire UNIGE11 Destruction PROCEDURE DetruireCourant(VAR l : ListeDouble):BOOLEAN; BEGIN IF l.courant # NIL THEN DEC(l.taille); IF l.taille = 0 THEN CreerListe(l); RETURN TRUE; ELSIF l.courant = l.tete THEN l.tete := l.courant.suivant;l.tete.precedent := NIL; ELSIF l.courant = l.queue THEN l.queue :=l.courant.precedent;l.queue.suivant := NIL; ELSE l.courant.precedent.suivant := l.courant.suivant; l.courant.suivant.precedent :=l.courant.precedent; END; l.courant := … RETURN TRUE; END; RETURN FALSE; END DetruireCourant;
23/03/05SE Info2 - S. L'haire UNIGE12 Parcours de liste 3 procédures: 1) Procédure pour placer le pointeur courant sur la tête PROCEDURE CourantSurTete(VAR l : ListeDouble): BOOLEAN; BEGIN IF l.taille # 0 THEN l.courant := l.tete; RETURN TRUE ELSE l.courant := NIL; RETURN FALSE END;
23/03/05SE Info2 - S. L'haire UNIGE13 Parcours (2) 2) Procédure pour sélectionner élément suivant PROCEDURE ElementSuivant(VAR l : ListeDouble): BOOLEAN; BEGIN IF l.courant.suivant # NIL THEN l.courant := l.courant.suivant; RETURN TRUE; ELSE RETURN FALSE; END ;
23/03/05SE Info2 - S. L'haire UNIGE14 Parcours (3) 3) Procédure de parcours IF CourantSurTete(l) THEN REPEAT l.courant.cle … UNTIL~ElementSuivant(l);
23/03/05SE Info2 - S. L'haire UNIGE15 Liste objet On transforme l'enregistrement MaListe en lui ajoutant un pointeur MaListe = POINTER TO RECORD tete, queue courant: ListeDoublePtr; taille : INTEGER; END;
23/03/05SE Info2 - S. L'haire UNIGE16 Initialisation de la liste Ajouter une méthode Procédure précédée du nom de l'objet auquel elle est rattachée et suivie du mot-clé NEW PROCEDURE (l : MaListe)Initialise():BOOLEAN, NEW; BEGIN l.tete := NIL; l.queue := NIL; l.courant:= NIL; l.taille := 0; END Initialise; … NEW(liste); liste.Initialise();
23/03/05SE Info2 - S. L'haire UNIGE17 Méthode ListeVide Très utile dans beaucoup de cas PROCEDURE (l: MaListe)ListeVide(): BOOLEAN; BEGIN RETURN taille = 0; Ou variante RETURN tete = NIL; … IF l.ListeVide() THEN …
23/03/05SE Info2 - S. L'haire UNIGE18 Méthode Parcours PROCEDURE (l : Liste)Parcours(), NEW; VAR temp : Liste; BEGIN IF ~l.ListeVide() THEN temp := l.courant; IF l.CourantSurTete() THEN REPEAT l.courant … UNTIL ~l.AllerSuivant(); l.courant := temp; Attention: courant est parfois utilisé par plusieurs procédures le sauver dans temp