IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Pascal Discussion :

Suppression d'une cellule d'une liste chaînée


Sujet :

Langage Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut Suppression d'une cellule d'une liste chaînée
    Bonjour,
    je viens de réaliser une procédure qui a pour but de retirer une cellule d'une liste chaînée ; pour cela l'adresse de celle-ci est indiquée au programme (ici a : Liste).
    Le sous-programme remplit bien sa fonction de base en retirant la cellule demandée, mais dans certains cas il retire également des cellules non désirées.
    Voici la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    procedure SupprCellule(var a : Liste;var L : Liste);
          var flag : integer;
          begin 
          flag := 0;
          if L = a then  {pour gérer le cas où la première cellule serait à supprimer}
                begin
                L := a^.suivant;
                dispose(a);
                flag := 1;
          end;
          while (flag <> 1) and (L <> nil) do {pour gérer tout les autres cas}
                begin 
                L^.suivant := a^.suivant;
                dispose(a);
                flag := 1;
          end;
          if flag <> 1 then 
                L := L^.suivant;
          end;
          end;
    Voyez-vous une erreur flagrante ? (je débute les listes chaînées)

  2. #2
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Salut

    Avant d'approfondir ton problème:
    - passes ton code dans des balises -> bouton #
    - donnes la description du type Liste.
    - décrit aussi les paramètres de ta procédure.
    - avec quel compilo travailles-tu ? (FreePascal, TurboPascal... il y ades différences).


    Nous ne sommes pas des devins, j'aimerais bien, j'aurais une bonne raison de jouer au loto...

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    procedure SupprCellule(var a : Liste;var L : Liste);
    var
      flag : integer;
    begin 
      flag := 0;
      if L = a then {pour gérer le cas où la première cellule serait à supprimer}
      begin // ouais
        L := a^.suivant;
        dispose(a);
        flag := 1;
      end;
      while (flag <> 1) and (L <> nil) do {pour gérer tout les autres cas}
      begin 
        // >>> A quoi sert le while ? puisque tu agis directement sur a
        L^.suivant := a^.suivant; // >>> ici tu perds (voir) les cellules qui précèdent a
        dispose(a);
        flag := 1;
      end;
      if flag <> 1 then 
        L := L^.suivant; // ici tu perds le premier élément de ta liste et la mémoire avec !!!
    //  end; end de trop !!! >>> ça compile pas !!
    end;
    Pose sur une feuille de papier les différents cas et éclaircis-toi les idées à l'aide de mes commentaires, c'est pas sorcier...

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut
    Salut en ce qui concerne le while, j'ai oublié une condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (flag <> 1) and (L <> nil) do {pour gérer tout les autres cas}
      begin 
      if a = L^suivant then 
            begin
              L^.suivant := a^.suivant; 
              dispose(a);
              flag := 1;
            end; ....
    La ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if flag <> 1 then 
        L := L^.suivant;
    permet de passer à la cellule suivante. (car je vérifie toute la liste pour changer la cellule qui pointe sur l'élément à supprimer)

    Ma liste chaînée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type  
        Liste = ^Cellule;
        Cellule = record
            contenu: voiture; 
            suivant: Liste;   
            end;
    Les 2 paramètres sont de type liste : a,b : Liste
    avec comme appel dans le programme principal : supprVehicule(b,a) le a est l'adresse de la cellule à supprimer.

  5. #5
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    en ce qui concerne le while, j'ai oublié une condition
    Ouais mais elle apporte pas grand chose. Comment fais-tu pour progresser dans la liste ???
    Le passage de à la ligne suivante est en dehors de la boucle , problème ?

    Pour les types, préfixe-les avec T, en Pascal, ça devient une tradition, ainsi
    Liste -> TListe.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut
    Encore désolé, j'ai mal recopié mon programme qui est sur mon PC portable.
    La ligne L := L^.suivant était bien dans la boucle while.
    Je viens de régler le problème : ne pas remettre le pointeur L à sa valeur de départ après être passé dans le while. (je n'avais jamais passé le pointeur de tête en paramètre par adresse)
    Donc voila ^^, merci beaucoup pour ton aide !

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  3. [XL-2007] problème de codage en vba ("copie d'une partie d'une cellule dans une cellule vide")
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/10/2010, 17h01
  4. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo