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 :

Insertion en fin de liste chaînée


Sujet :

Langage Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Insertion en fin de liste chaînée
    Bonjour,

    Je requiers votre aide concernant l'insertion en fin de liste :
    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
     
    procedure empilerQueue(val : integer; var tete : liste);
        var tmp, tmp2: liste;
     
        begin
            new(tmp);
            new(tmp2);
            tmp := tete;
            while( tmp^.data <> nil) do
            begin
                tmp := tmp^.suiv;
            end;
            tmp2^.data := val;
            tmp2^.suiv := nil;
            tmp^.suiv := tmp2;
     
        end;
    Il y a une erreur dans le "while" que je ne comprends pas : "operator is not overloaded".
    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    *** EDIT *** Après relecture ...

    Vous n'indiquez pas la structure de votre type liste. Je suppose que c'est donc quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      liste = ^noeudliste;
      noeudliste = record
        data: integer;
        suiv: liste;
      end;
    En ce qui concerne le message d'erreur que vous indiquez:

    - soit vous testez vraiment le champ data, qui est manifestement un type entier (i.e. un integer). Ce qui donne alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( tmp^.data <> 0) do  // (et non tmp^.data <> nil)
    - soit, plus normalement, vous testez l'existence d'une occurrence suivante dans la liste, et c'est alors le champ suiv qu'il faut utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( tmp^.suiv <> nil) do

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    J'ai essayé les deux possibilités que tu donnes :

    Comparer ^.data à 0 aboutis à une General protection fault.

    Comparer ^.suiv à nil me renvoi la liste sans l'ajout en fin.

    Je dois surement avoir une erreur ailleurs dans le programme.

  4. #4
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    En fait, la première "possibilité" n'est pas à utiliser. Je l'ai indiquée uniquement pour expliquer la raison de l'erreur renvoyée par le compilateur.

    Ceci étant, c'est bien le champ suiv qui doit être testé.

    Voici un très court exemple (en Free Pascal) pour illustrer l'utilisation de votre procédure d'insertion en fin de liste:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    program project1;
     
     
    type
      liste = ^noeudliste;
      noeudliste = record
        data: integer;
        suiv: liste;
      end;
     
    procedure empilerQueue(val : integer; var tete : liste);
       var tmp, tmp2: liste;
     
       begin
           new(tmp);
           new(tmp2);
           tmp := tete;
    //       while( tmp^.data <> nil) do
           while( tmp^.suiv <> nil) do
           begin
               tmp := tmp^.suiv;
           end;
           tmp2^.data := val;
           tmp2^.suiv := nil;
           tmp^.suiv := tmp2;
     
       end;
     
     
    var test, pl: liste;
     
    begin
      new(test);
      test^.data := 1;
      test^.suiv := nil;
      empilerQueue(2, test);
      empilerQueue(3, test);
      empilerQueue(10, test);
      empilerQueue(100, test);
      empilerQueue(50, test);
      // list display
      pl := test;
      while pl<>nil do
        begin
          writeln(pl^.data);
          pl := pl^.suiv;
        end;
    end.
    Ce qui donne comme résultat:
    1
    2
    3
    10
    100
    50

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Je ne comprend absolument pas, j'ai exactement le même code que toi et pourtant ça ne me met rien du tout en queue de liste. Peut-être ma version de FPS n'est pas la bonne...

    J'ai essayé d'initialiser ma liste comme toi, une valeur puis nul, je me retrouve avec un 'general protection fault'.

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    Salut

    Pas tout à fait d'accord avec le code:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    program project1;
     
     
    type
      liste = ^noeudliste;
      noeudliste = record
        data: integer;
        suiv: liste;
      end;
     
    procedure empilerQueue(val : integer; var tete : liste);
       var tmp, tmp2: liste;
     
       begin
           new(tmp);
           new(tmp2);
           tmp := tete;
    //       while( tmp^.data <> nil) do
           while( tmp^.suiv <> nil) do
           begin
               tmp := tmp^.suiv;
           end;
           tmp2^.data := val;
           tmp2^.suiv := nil;
           tmp^.suiv := tmp2;
     
       end;
     
     
    var test, pl: liste;
     
    begin
      new(test);
      test^.data := 1;
      test^.suiv := nil;
      empilerQueue(2, test);
      empilerQueue(3, test);
      empilerQueue(10, test);
      empilerQueue(100, test);
      empilerQueue(50, test);
      // list display
      pl := test;
      while pl<>nil do
        begin
          writeln(pl^.data);
          pl := pl^.suiv;
        end;
    end.
    Bien que le code me semble fonctionner (mentalement parlant, je n'ai pas le compilateur sous la main); l'allocation est inutile et est immédiatement perdue avec l'instruction ensuite le cas où Tete est égal à nil n'est pas traité ce qui obligé à traiter la première insertion de manière spéciale en dehors de la procédure.

    @coolam:Je trouve le nom de la procédure EmpilerQueue mal choisi. Empiler fait penser à une pile, utilise plutôt le verbe enfiler.

    Je propose donc
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    function NouvelElem(val : integer); liste;
    var
      elem: Liste;
    begin
      new(elem);
      elem^.data := val;
      elem^.suiv := Nil;
      NouvelElem := elem;
    end;
     
    procedure enfilerQueue(val : integer; var tete : liste);
    var 
       tmp: liste;
    begin
      if (tete = Nil) then
      begin
        NouvelElem(tete);
      end
      else
      begin
           tmp := tete;
           while (tmp^.suiv <> nil) do
               tmp := tmp^.suiv;
           tmp^.suiv := NouvelElem(val);
      end;
    end;
     
    var test, pl: liste;
     
    begin
      enfilerQueue(1, test);
      enfilerQueue(2, test);
      enfilerQueue(3, test);
      enfilerQueue(10, test);
      enfilerQueue(100, test);
      enfilerQueue(50, test);
      // list display
      pl := test;
      while pl<>nil do
        begin
          writeln(pl^.data);
          pl := pl^.suiv;
        end
    end.
    Pas testé...

    Cdlt

    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."

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bien joué ! Ton code marche correctement et je t'en remercie
    A bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. liste chaînée en ada insertion à la fin
    Par koda29 dans le forum Ada
    Réponses: 13
    Dernier message: 05/04/2010, 16h31
  2. Recherche d'index à partir de la fin d'une liste chaînée
    Par Jimalexp dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 01/01/2009, 13h07
  3. insertion dans Liste chaînée
    Par ALIAS200 dans le forum Débuter
    Réponses: 12
    Dernier message: 29/02/2008, 10h20
  4. liste chainée et insertion en fin ou debut
    Par bonjour69 dans le forum C
    Réponses: 7
    Dernier message: 21/12/2005, 21h50
  5. Insertion d'un noeud dans une liste chaînée
    Par habib106 dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/04/2004, 23h34

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