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

Turbo Pascal Discussion :

Erreur lors de l'ajout d'un élément dans une liste chaînée triée


Sujet :

Turbo Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Erreur lors de l'ajout d'un élément dans une liste chaînée triée
    Salut tout le monde,

    Je travaille en ce moment sur un TP qui a pour but la manipulation des listes chaînées ( http://i.imgur.com/aH9Fr.jpg ).

    J'ai un problème au niveau de la procédure "Insert" (qui insert un entier v à sa place dans une liste L supposée triée par ordre croissant).

    En effet quand j’exécute l'entier s'ajoute normalement mais après ça me donne une fenêtre d'erreur :



    Voilà le programme:
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    PROGRAM TP2;
    uses wincrt;
    CONST K=20 ;
    TYPE TP = array[1..K] of integer ;
         LISTE = ^Maillon;
         Maillon = record
                         info: integer;
                         suiv: liste;
                   end;
    VAR T: TP;
        N,V: integer;
        L1,L2:liste;
     
     
    PROCEDURE affiche(List:liste); {Affiche les éléments d'une liste donnée}
    var S:liste;
    begin
          writeln('Les éléments de la liste sont:');
         S:=List;
         While S <> nil do
               begin
                    write(S^.info,', ');
                    S:=S^.suiv;
               end;
         writeln;
    end;
     
     
    PROCEDURE initvec (var V:TP; N:integer);{initialise un tableau}
    var i:integer;
    begin
         randomize; {Peut être aussi déclaré à l'interieur de la boucle}
         writeln('Les éléments du vecteur sont:');
         for i:=1 to N do
             begin
                  V[i]:= random(101);
                  write(V[i],'|');
             end;
         writeln;
    end;
     
     
    PROCEDURE aff_lis(List:liste); {Affiche les éléments d'une liste donnée}
    var S:liste;
    begin
          writeln('Les éléments de la liste sont:');
         S:=List;
         While S <> nil do
               begin
                    write(S^.info,'|');
                    S:=S^.suiv;
               end;
         writeln;
    end;
     
     
    PROCEDURE ajout(Ve:TP; var La:liste); {ajout des elements d'un vecteur vers une liste}
    var i: integer;
        e:liste;
        s:liste;
    begin
         for i:=N downto 1 do
             begin
                  new(e);
                  e^.info:=ve[i];
                  e^.suiv:=La;
                  La:=E;
             end;
     
         aff_lis(La);
    end;
     
     
    PROCEDURE insert (var L:liste; x:integer); {inserer v dans une liste triée}
    var P,E:liste;
    begin
         new(E);
         E^.info:=x;
         if L=nil then L:=E
         else
         begin
              P:=L;
              while P<>nil do if x>p^.info then p:=p^.suiv;
                    E^.suiv:=P^.suiv;
                    P^.suiv:=E;
         end;
         aff_lis(L);
    end;
     
     
    {programme principal}
    BEGIN
         repeat
            writeln('Donnez une valeur à N inférieure à ',K);
            readln(N);
         until  (N<=K);
     
         writeln('N= ',N);
         initvec(T,N);
         ajout(T,L1);
         writeln('V= ?');
         readln(v);
         insert(L2,v);
     
    END.
    Merci d'avance !!

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 84
    Points : 61
    Points
    61
    Par défaut
    Déja: toujours initialiser TOUTES les variables, et TOUS les champs. Parce que, ligne 80. si L est nil, tu te retrouves avec une valeur de E dont le suivant n'est pas initialiser.

    Ensuite: TOUJOURS (même quand il n'y a qu'une seule instruction) mettre des begin, end. Parce que, peux-tu me dire, dans ton cas, comment tu compte sortir un jour de la ligne 84? Sachant que 5 est inférieur à 64 tu vas te retrouver dans une boucle infinie. Or, comme tu as une mauvaise indentation des deux lignes suivantes (hors du while)....

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par alakauf Voir le message
    Déja: toujours initialiser TOUTES les variables, et TOUS les champs. Parce que, ligne 80. si L est nil, tu te retrouves avec une valeur de E dont le suivant n'est pas initialiser.

    Ensuite: TOUJOURS (même quand il n'y a qu'une seule instruction) mettre des begin, end. Parce que, peux-tu me dire, dans ton cas, comment tu compte sortir un jour de la ligne 84? Sachant que 5 est inférieur à 64 tu vas te retrouver dans une boucle infinie. Or, comme tu as une mauvaise indentation des deux lignes suivantes (hors du while)....
    Merci pour vos conseils
    mais je crois que la procédure en elle même est fausse sachant que son but c'est d'insérer un entier V dans une liste supposée trié par ordre croissant vous pouvez me proposer une autre procédure s'il vous plait ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 84
    Points : 61
    Points
    61
    Par défaut
    Reprenons ton exemple et faisons du pas à pas:
    L = {41, 64, 75, 88}. Je te donne là la liste triée, qui devrait y être. Car ta liste à toi n'est pas triée. Ce qui, soit dit en passant est une première erreur. Quand tu passes tu tableau à la liste il faut que tu appelles insert() de sorte que la liste soit effectivement triée.

    x=5

    Donc E.x=5 et E.suiv = nil (au moins si c'est bien écrit)
    P=L Je vais donc tester 5 par rapport à 41. Comme 5 < 41 je sors de ta boucle (enfin c'est normalement ce qui devrait se passer).

    Je continue:
    E.Suiv = P.suiv = l'élément pointé par 64.
    P.suiv = E. Autrement dit tu insères 5 entre 41 et 64. techniquement en dehors des bugs signalés, ta fonction ne marche pas.

    Pour terminer, par rapport à ton programme (un bug que je n'avais pas vu). Tu appelles insert() sur L2. Sauf que tu n'as jamais initialisé L2. Ce qui est probablement LE bug qui te fait exploser ton programme puisqu'on se trouve dans la situation d'une insertion dans une liste vide d'un élément dont le pointeur sur le suivant n'a pas été initialisé.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Effectivement le bug qui affiche la fenêtre a bien disparu en initialisant L2 à Nil au début du programme principal mais pour la procédure je ne sais toujours pas comment la corriger :/

  6. #6
    Membre éprouvé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Points : 917
    Points
    917
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PROCEDURE insert (var L:liste; x:integer); {inserer v dans une liste triée}
    var P,E:liste;
    begin
         new(E);
         E^.info:=x;
         if L=nil then L:=E
    dans ce code là, quand tu met ton premier élément dans la liste, du dois faire pointer le suiv de ton maillon vers nil

Discussions similaires

  1. [Débutant] Ajouter un nouvel élément dans une liste à partir d'un formulaire
    Par pliza dans le forum Développement Sharepoint
    Réponses: 3
    Dernier message: 27/08/2014, 18h05
  2. [Free Pascal] Insertion d'éléments dans une liste chaînée
    Par Pacorabanix dans le forum Free Pascal
    Réponses: 4
    Dernier message: 20/04/2010, 00h42
  3. Réponses: 1
    Dernier message: 18/11/2009, 08h38
  4. Réponses: 1
    Dernier message: 31/05/2009, 22h29
  5. Réponses: 4
    Dernier message: 06/01/2007, 23h11

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