Corrigé 17.  Enoncé

1. Insertion par position dans une liste bidirectionnelle.

Insertion d'un élément Val dans une liste bidirectionnelle L à la k-ième position

On suppose L # NIL et k > 0.

    P := L
    I := 0
    TANTQUE P # NIL ET I < (K-1) :
        P := Suivant(P)
        I := I + 1
    FINTANTQUE
    {P pointe Le K-ième élément}
    {Effectuons une insertion avant cet élément }
    Allouer(Q, Typemaillon)
    Aff_Val(Q, Val)
    SI Précédent(P) # NIL :
        Aff_Adrd(Précédent(P), Q)
    SINON
        L := Q
    FSI
    Aff_Adrg(Q, Précédent(P) )
    Aff_Adrd(Q, P)
    Aff_Adrg(P, Q)

2. Inversion d'une liste linéaire chaînée

Module récursif d'inversion

    Inverser(L) :
    SI L # NIL :
        Inverser( Suivant(L))
        Insérer ( Tête, Valeur(L) )
    FSI

Le module Insérer(Tête, Val) insère la valeur Val dans la liste pointée par Tête. Il est défini comme suit :

    Allouer(Q, Typemaillon)
    Aff_Val(Q, Val)
    Aff_Adr(Q, Tête)
    Tête := Q

Trace


Iv(L)     =     Iv(P1), Is(5)
    =    Iv(P2),Is(12), Is(5)
    =     Iv(P3), Is(14), Is(12), Is(5)
    =     Iv(Nil), Is(8), Is(14), Is(12), Is(5)
    =     Is(8), Is(14), Is(12), Is(5)

Iv désigne le module Inverser et Is le module Insérer.

3. Parcours d'un arbre binaire

Prenons l'inordre.

Algorithme récursif
   
    In(N) :
    SI N # NIL :
        In(Fg(N)) ; "Info(N)" ; In(Fd(N))
    FSI

Algorithme itératif avec une pile

    Créerpile(Pile)
    Possible := VRAI
    TANTQUE Possible :
        TANTQUE P # NIL :
            Empiler (Pile, P)
            P := Fg(P)
        FINTANTQUE
        SI NON Pilevide(Pile) :
            Dépiler(Pile, P)
            " Info(P) "
            P := Fd(P)
        SINON
            Possible := FAUX
        FSI
    FINTANTQUE

4. Implémentation d'une pile.

Créerpile(Pile)         :      Pile := NIL
Pilevide(Pile)           :      Pilevide := ( Pile = NIL)

Empiler(Pile, Val)   :      Allouer (Q, Typemaillon)
                                       Aff_Val(Q, Val)
                                       Aff_Adr(Q, Pile)
                                       Pile := Q

Dépiler(Pile, Val)   :     SI NON Pilevide(Pile) :
                                            Q := Pile
                                            Valeur := Info(Pile)
                                            Pile := Suivant(Pile)
                                            Libérer(Q)
                                      SINON " Pile vide" FSI



5. Recherche dans l'essai linéaire

Module de recherche

Soit T le tableau en mémoire centrale. Chaque entrée est le couple (Valeur, Occupé). Valeur est la valeur rangée et Occupé un booléen indiquant si l'entrée est occupée ou pas.

    I := H(Clé)
    Trouv, Vide := FAUX
    TANTQUE NON Trouv ET NON Vide :
        SI T(I).Valeur = Val :
            Trouv := VRAI
        SINON
            SI NON T(I).Occupé :
                Vide := VRAI
            SINON I := I-1, SI I <0 : I := I+M FSI
        FSI
    FINTANTQUE

Noter qu'il doit toujours exister une position vide dans le vecteur.

6. Arbre de recherche m-aire

Structure logique d'un noeud

Il y a n pointeurs et (n-1) clés.
On peut définir le modèle suivant sur le noeud :
Fils(Bloc, I)     : accès au i-ième fils du noeud contenu dans Bloc. 1 <= I <= n.
Clé(Bloc, I)     : accès à la i-ième clé du noeud contenu dans Bloc. 1 <= I < n.
Nbr(Bloc)     : nombre courant de fils dans Bloc.

Algorithme

    { Soit Racine le pointeur de la page racine sur le disque}
    P := Racine
    Trouv := FAUX
    TANTQUE P # NIL ET NON Trouv :
        Lirebloc(F, P, Bloc)
        I := 1 ; Trouv := FAUX
        TANTQUE I < Nbr(Bloc) ET NON Trouv :
            SI Clé(Bloc, I) >= Clé :
                Trouv := VRAI
            SINON I := I + 1 FSI
        FINTANTQUE
        SI Trouv :
            SI Clé(Bloc, I) = Clé :
                Trouv := VRAI
            SINON
                P := Fils(Bloc, I)
            FSI
        SINON P := Fils(Bloc, I) FSI
    FINTANTQUE