Corrigé 42.  Enoncé

Listes en étoiles

Soient Etoile un tableau ( 10 ) de Listes de chaînes de caractères.

Initialisation
    POUR I := 1 , 10
        Aff_element ( Etoile [ I ] , Nil )
    FPOUR

Création
    Lire ( N )
    POUR I := 1 , N
        Ch := ALEACHAINE ( ALEANOMBRE ( 10 ) + 1 )
        Allouer ( Q )
        Aff_val ( Q , Ch )
        Long := Longchaine ( Ch )
        SI Element ( Etoile [ Long ] ) = Nil
            Aff_adr ( Q , Nil )
        SINON
            Aff_adr ( Q , Element ( Etoile [ Longchaine ( Ch ) ] ) )
        FSI
        Aff_element ( Etoile [ Longchaine ( Ch ) ] , Q )
    FPOUR

Trier


    POUR I := 1 , 10 L := Element ( Etoile [ I ] )
        Der := Nil
        TANTQUE Der <> L
            P := L
            TANTQUE Suivant ( P ) <> Der
                SI Valeur ( P ) > Valeur ( Suivant ( P ) )
                    Aux := Valeur ( P )
                    Aff_val ( P , Valeur ( Suivant ( P ) ) )
                    Aff_val ( Suivant ( P ) , Aux )
                FSI
                P := Suivant ( P )
            FTANTQUE
            Der := P
        FTANTQUE
    FPOUR

Imprimer
    POUR I := 1 , 10 Ecrire

         ( '******** Longueur ' , I )

        Q := Element ( Etoile [ I ] )
        TANTQUE Q <> Nil
            Ecrire ( Valeur ( Q ) )
            Q := Suivant ( Q )
        FTANTQUE
    FINPOUR


Requête x

    Lire ( Ch ) { élément à rechercher }
    L := Element ( Etoile [ Longchaine ( Ch ) ] )
    Arret := FAUX
    Compt := 0
    TANTQUE ( L <> Nil ) Et NON Arret
        SI Ch = Valeur ( L )
            Compt := Compt + 1
            L := Suivant ( L )
        SINON
            SI Valeur ( L ) > Ch
                Arret := VRAI
            SINON
                L := Suivant ( L )
            FSI
        FSI
    FTANTQUE
    Ecrire ( 'Liste ' , Longchaine ( Ch ) , ' compte= ' , Compt )


Requête x+


    Lire ( Ch ) { Ch c'est x }
    POUR I := Longchaine ( Ch ) , 10
        L := Element ( Etoile [ I ] )
        Compt := 0
        Arret := FAUX
        TANTQUE ( L <> Nil ) Et NON Arret
            {recherche dans un mot}
            Mot := Valeur ( L )
            SI Caract ( Ch , 1 ) = Caract ( Mot , 1 )
                SI Longchaine ( Mot ) >= Longchaine ( Ch )
                    {former le sous-mot}
                    Smot := ''
                    POUR J := 1 , Longchaine ( Ch )
                        Smot := Smot + Caract ( Mot , J )
                    FPOUR
                    SI(Ch=Smot) Et ( Longchaine ( Ch ) < Longchaine ( Mot ) )
                        Compt := Compt + 1
                    FSI
                FSI
                L := Suivant ( L )
            SINON
                SI Caract ( Ch , 1 ) < Caract ( Mot , 1 ) :
                    Arret := VRAI
                SINON
                    L := Suivant ( L )
                FSI
            FSI
        FTANTQUE
        SI Compt <> 0
            Ecrire ( 'Liste ' , I , ' compte= ' , Compt )
        FSI
    FPOUR

Requête +x

    Lire ( Ch )
    POUR I := Longchaine ( Ch ) , 10
        L := Element ( Etoile [ I ] )
        Compt := 0
        TANTQUE L <> Nil
            {recherche dans un mot}
            Mot := Valeur ( L )
            K := 1
            Arret := FAUX
            TANTQUE NON Arret
                Trouv := FAUX
                TANTQUE NON Trouv Et ( K <= Longchaine ( Mot ) )
                    SI Caract ( Ch , 1 ) = Caract ( Mot , K )
                        Trouv := VRAI
                    SINON
                        K := K + 1
                    FSI
                FTANTQUE
                SI Trouv
                    SI ( Longchaine ( Mot ) - K + 1 ) < Longchaine ( Ch )
                        Arret := VRAI
                    SINON
                        {former le sous-mot}
                        Smot := ''
                        POUR J := K , K + Longchaine ( Ch ) - 1
                            Smot := Smot + Caract ( Mot , J )
                        FPOUR
                        SI(Ch=Smot)Et(K<>1 )Et (K+Longchaine(Ch)-1=Longchaine ( Mot ) )

                            Compt := Compt + 1 ;  Arret := VRAI

                        SINON
                            K := K + 1
                        FSI
                    FSI        
                SINON
                    Arret := VRAI
                FSI
            FTANTQUE
            L := Suivant ( L )
        FTANTQUE
        SI Compt <> 0
            Ecrire ( 'Liste ' , I , ' compte= ' , Compt )
        FSI
    FPOUR

Requête *x*
    Lire ( Ch )
    POUR I := Longchaine ( Ch ) , 10
        L := Element ( Etoile [ I ] )
        Compt := 0
        TANTQUE L <> Nil
            {recherche dans un mot}
            Mot := Valeur ( L )
            K := 1 ; Arret := FAUX
            TANTQUE NON Arret
                Trouv := FAUX
                TANTQUE NON Trouv Et ( K <= Longchaine ( Mot ) )
                    SI Caract ( Ch , 1 ) = Caract ( Mot , K )
                        Trouv := VRAI
                    SINON
                        K := K + 1
                    FSI
                FTANTQUE
                SI Trouv
                    SI ( Longchaine ( Mot ) - K + 1 ) < Longchaine ( Ch )
                        Arret := VRAI
                    SINON
                        {former le sous-mot}
                        Smot := ''
                        POUR J := K , K + Longchaine ( Ch ) - 1
                            Smot := Smot + Caract ( Mot , J )
                        FPOUR
                        SI Ch = Smot
                            Compt := Compt + 1
                            Arret := VRAI
                        SINON
                            K := K + 1
                        FSI
                    FSI
                SINON
                    Arret := VRAI
                FSI
            FTANTQUE
            L := Suivant ( L )
        FTANTQUE
        SI Compt <> 0
            Ecrire ( 'Liste ' , I , ' compte= ' , Compt )
        FSI
    FPOUR