Probléme algorithmique (liste chainée)

Résolu
gigimino Messages postés 45 Statut Membre -  
 abouta -
Bonjour,
a tous voila j'ai un problème,je veux faire un algo qui supprime tout les valeurs négatives d'une liste chainée (simple) donnée ; mon problème exacte c'est comment on supprime deux valeur négative l'un après l'autre; (turbo pascal) merci d'avance.

6 réponses

  1. nicocorico Messages postés 846 Statut Membre 138
     
    Ton problème tiens au fait que tu ne retiens pas un pointeur fiable sur le 1er maillon de la chaine, il faut que tu déclares une variable qui pointe dessus, ou un maillon fixe (ça évite de tester si on touche au 1er maillon)... Et en fixant le champ 'suivant' du nouvel enregistrement sur le sommet précédent, tu construis ta liste à l'envers.
    De plus, au lieu de détruire les enregistrements invalides, autant éviter de les construire :
    program liste;          
    type lien =^objet;          
      objet = record          
        info :real;          
        suivant: lien;          
      end;          
    var First, sommet, p : lien ; i : integer;          
        Value : Real;         
    
    begin          
    write('entrer 6 nombre : ');          
    First:= Nil;          
    for i := 1 to 6 do          
    begin          
      read(Value);         
      If Value > 0 then         
      begin         
        New(p);          
        P.Info:= Value;      
        P.Suivant:= nil;     
        If First = nil then First:= P else Sommet.Suivant:= P;           
        sommet:= p;          
      end;         
    end;          
    
    P:= First;         
    while P <> nil do          
    begin             
      write(p.info);          
      P:= P.Suivant;         
    end;          
    end.         
    


    Et si tu y tiens voici le code en créant puis supprimant les enregistrements invalides :
    program liste;          
    
    type lien =^objet;          
      objet = record          
        info :real;          
        suivant: lien;          
      end;          
    
    var First, sommet, p, Pred, Suiv : lien ; i : integer;          
    
    begin          
    write('entrer 6 nombre : ');          
    First:= Nil;          
    for i := 1 to 6 do          
    begin          
      New(p);          
      read(p.info);         
      P.Suivant:= nil;  
      If First = nil then First:= P else Sommet.Suivant:= P;           
      sommet:= p;          
    end;          
    
    Pred := nil;         
    P:= First;         
    while P <> nil do          
    begin         
      Suiv := P.Suivant;         
      if (P.info <0) then          
      begin          
        If Pred <> nil then Pred.Suivant:= Suiv else First := Suiv;         
        dispose(P);          
      end else          
      begin        
        write(p.info);          
        Pred:= p;         
      end;         
      P:= Suiv;         
    end;          
    
    end.         
    
    2
  2. ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   342
     
    Si tu fais ça maillon par maillon y'a pas de problème ...
    0
  3. gigimino Messages postés 45 Statut Membre 2
     
    oui oui il ya pas de problème mais il faut que l'algorithme donne un résultat correct de tout les cas possible .
    0
  4. ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   342
     
    Tu peux montrer ton code que je te dise ça tout de suite ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. gigimino Messages postés 45 Statut Membre 2
     
    program liste;
    type lien =^objet;
    objet=record
    info :real;
    suivant: lien;
    end;
    var , sommet, p,q : lien ; i : integer;

    begin
    write('entrer 6 nombre : ');
    sommet :=Nil;
    for i :=1 to 6 do begin
    New(p); read(p^.info);
    p^.suivant:=sommet;
    sommet:=p;
    end;

    while p<> nil do begin
    if (p^.info <0) then begin
    q:=p;
    p:=p^.suivant;
    q^.suivant:=p;
    dispose(q);

    end;
    if p^.info>0 then begin
    write(p^.info);
    p:=p^.suivant;

    end;
    end;
    end.
    0
  7. gigimino Messages postés 45 Statut Membre 2
     
    merci pour l'algorithme il est plus professionnel que le mien mais j'ai quel que chose a vous poser puisque je suis débutant. le sommet pointe vers qui j'ai cru qu'il est un pointeur qui pointe vers le premier maillon mais la je vois un autre pointeur "first", peut tu m'explique ? et merci bcp ravi de parler avec les gent comme vous.
    0
    1. nicocorico Messages postés 846 Statut Membre 138
       
      Le pointeur first pointe sur le 1er maillon de la chaine, ce qui permet de pouvoir la relire dans l'ordre de création, tout simplement... Sinon il est possible de constituer des chaines de différentes façons, ton approche n'était pas fondamentalement fausse mais pour s'y retrouver il est important de nommer 'Suivant' le maillon qui est à venir... Et tu aurais pu aussi faire pointer le dernier sur le premier, et insérer chaque nouveau maillon entre les deux, et donc n'avoir que 'Sommet' et te passer de 'First' etc...

      Le chêne aussi était un gland, avant d'être un chêne
      0
    2. abir
       
      comment par la liste chaînée de diviser les cartes du jeu de carte rami ses jockers
      0
    3. abouta
       
      jeu de carte rami de 104 carte avec la liste chaînée
      0