Probléme algorithmique (liste chainée)
Résolu/Fermé
gigimino
Messages postés
42
Date d'inscription
lundi 27 décembre 2010
Statut
Membre
Dernière intervention
21 décembre 2011
-
20 juil. 2011 à 21:00
abouta - 22 mars 2014 à 15:26
abouta - 22 mars 2014 à 15:26
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.
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.
A voir également:
- Probléme algorithmique (liste chainée)
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste site streaming illégal - Accueil - Services en ligne
- Liste groupe whatsapp - Guide
- Liste code ascii - Guide
6 réponses
nicocorico
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
138
Modifié par nicocorico le 21/07/2011 à 07:30
Modifié par nicocorico le 21/07/2011 à 07:30
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 :
Et si tu y tiens voici le code en créant puis supprimant les enregistrements invalides :
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.
ghuysmans99
Messages postés
2496
Date d'inscription
jeudi 14 juillet 2005
Statut
Contributeur
Dernière intervention
5 juin 2016
340
20 juil. 2011 à 21:57
20 juil. 2011 à 21:57
Si tu fais ça maillon par maillon y'a pas de problème ...
gigimino
Messages postés
42
Date d'inscription
lundi 27 décembre 2010
Statut
Membre
Dernière intervention
21 décembre 2011
2
20 juil. 2011 à 22:04
20 juil. 2011 à 22:04
oui oui il ya pas de problème mais il faut que l'algorithme donne un résultat correct de tout les cas possible .
ghuysmans99
Messages postés
2496
Date d'inscription
jeudi 14 juillet 2005
Statut
Contributeur
Dernière intervention
5 juin 2016
340
20 juil. 2011 à 22:49
20 juil. 2011 à 22:49
Tu peux montrer ton code que je te dise ça tout de suite ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
gigimino
Messages postés
42
Date d'inscription
lundi 27 décembre 2010
Statut
Membre
Dernière intervention
21 décembre 2011
2
21 juil. 2011 à 02:04
21 juil. 2011 à 02:04
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.
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.
gigimino
Messages postés
42
Date d'inscription
lundi 27 décembre 2010
Statut
Membre
Dernière intervention
21 décembre 2011
2
21 juil. 2011 à 13:52
21 juil. 2011 à 13:52
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.
nicocorico
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
138
Modifié par nicocorico le 21/07/2011 à 19:15
Modifié par nicocorico le 21/07/2011 à 19:15
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