SupprimeDoublons

Anna -  
 Anna -
Bonsoir,

Je veux créer un algorithme qui supprime les doublons dans une liste chaînée triée dans l'ordre croissant et qui contient des caractères alphabétique. SVP, qui peut me dire est ce que c'est correcte ?

Procédure supprimeDoublons( Var L : Liste )
Var
Q,P : Liste
Début
Q<- L
Si L # nil Alors
Tant que Q^.suiv # nil Faire
P<- Q
Q<-Q^.suiv
si Q^.val = P^.val Alors
Q^.suiv <- P^.suiv
Libérer (P)
Fin Si
Fin Tant que
Fin S
Fin

2 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    En gros ça a l'air bon, cependant j'ai un doute sur
    Q^.suiv <- P^.suiv
    ...

    On a :
    P<- Q
    Q<-Q^.suiv

    Donc
    P^.suiv
    c'est l'ancien
    Q^.suiv
    et donc le nouveau
    Q
    , si tu fais
    Q^.suiv <- P^.suiv
    ça donne donc
    Q^.suiv <- Q
    , or il me semble qu'il faudrait plutôt avoir
    Q <- Q^.suiv
    pour supprimer la valeur de Q
    0
    1. Anna
       
      Merciii pour votre réponse, donc ça devient comme ça :

      Procédure supprimeDoublons( Var L : Liste )
      Var
      Q,P : Liste
      Début
      Q<- L
      Si L # nil Alors
      Tant que Q^.suiv # nil Faire
      P<- Q
      Q<-Q^.suiv
      si Q^.val = P^.val Alors
      P^.suiv <- O^.suiv
      Libérer (Q)
      Fin Si
      Fin Tant que
      Fin S
      Fin
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      Pour l'inversion c'est mieux, cependant je préférais
      Libérer(P)
      , car avec
      Libérer(Q)
      ta boucle
      Q^.suiv # nil
      va poser problème.

      Remarque : c'est typiquement le genre de problèmes qui se résout bien avec de la récursivité.
      0
      1. Anna > KX Messages postés 19031 Statut Modérateur
         
        Merci beaucoup, je vais essayer encore
        0
  2. Anna
     
    Bonjour,

    j'ai pas trouvée aucune solution, si je libère P je dois utiliser chaînage double pour affecter l'@ qui existe en P au pointeur précédent ( mais dans mon cas je dois trouver la solution avec chaînage simple ) et si je libère Q je ne sais pas comment ça marche avec le boucle tant que !!! ? SVP, n’hésitez pas à m'aider si vous avez des idées.
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Pour bien progresser, tu pourrais essayer de faire ton algorithme avec un vrai langage de programmation (sur papier ce n'est pas évident à valider).
      Dans ton cas, le passage au langage Pascal ne devrait pas trop poser de problème.

      Avec IPcute tu pourrais visualiser ton algorithme s'exécuter pas à pas et voir l'état de libération de la mémoire. Voir Prise en main d'IPcute pour des exemples.
      0
      1. Anna > KX Messages postés 19031 Statut Modérateur
         
        OK, mercii beaucoup KX
        0