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

Pascal Discussion :

Tri d'une liste chaînée en mémoire centrale


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 35
    Par défaut Tri d'une liste chaînée en mémoire centrale
    Bonjour

    Voilà, je trie une liste chaînée avec un tri à bulle mais, après le tri, elle me sort des valeurs incorrectes - ce qui veux dire que mes pointeurs pointent vers des cellules mémoire qui ne sont pas celles de mon programme. Mais je ne trouve pas où ça plante.

    Voici 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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    Procedure classer(var debutl : Pointskieur; nbskieur : integer);
     
    	var
    		Vactu, Vpres, Vinter : Pointskieur;
    		fini, permut : boolean;
    		i : integer;
    	BEGIN
    	WriteLn('hello de lu');
    	Repeat
    		fini := true;
    		Vactu := debutl;
    		Vpres := nil;
    		while Vactu <> nil do
    			begin
    			permut:=false;
    			if Vactu^.temps.min > Vactu^.next^.temps.min then
    				begin
    				fini:= false;
    				permut:= true;
    				end				
    			else
    				begin
    				if (Vactu^.temps.min = Vactu^.next^.temps.min) and (Vactu^.temps.sec > Vactu^.next^.temps.sec) then
    					begin
    					fini:= false;
    					permut:= true;
    					end
    				else
    					begin
    					if (Vactu^.temps.min = Vactu^.next^.temps.min) and (Vactu^.temps.sec = Vactu^.next^.temps.sec) 
    					and (Vactu^.temps.cen > Vactu^.next^.temps.cen) then
    						begin
    						fini:= false;
    						permut:= true;
    						end;
    					end;
    				end;
     
    			if permut then
    				begin
    					if Vpres = nil then
    						begin
    						debutl := Vactu^.next;
    						Vinter := Vactu^.next^.next;
    						debutl^.next := Vactu;
    						Vactu^.next := Vinter;
    						end
    					else
    						begin
    						Vpres^.next := Vactu^.next;
    						Vinter := Vactu^.next^.next;
    						Vactu^.next^.next := Vactu;
    						Vactu^.next := Vinter;
    						end;
    				end;
    			Vactu := Vactu^.next
    			end;	
    	Until (fini);
    end;
    Je reçois donc dans cette fonction le pointeur du premier élément et le nombre d'éléments de la liste. Je fais donc une boucle sur le nombre d'éléments. Les if servent à savoir si on permute ou non. Si Vpres est vide alors ça veut dire que c'est le premier élément de la liste.

    Voilà, si quelqu'un voit où ça cloche.

    Merci de votre aide

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 065
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    J'ai (un peu) fait tourner ton algorithme sur papier. Les permutations ont l'air de s'effectuer correctement mais on se retouve rapidement dans la situation où Vactu^.next vaut Nil à ce niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Vactu^.temps.min > Vactu^.next^.temps.min then
    D'où le plantage.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

Discussions similaires

  1. Tri conditionnel d'une liste chaînée
    Par floopi51 dans le forum Débuter
    Réponses: 4
    Dernier message: 04/03/2013, 17h26
  2. [TRI] tri d'une list provenant de LabelValueBean
    Par Canou dans le forum Struts 1
    Réponses: 6
    Dernier message: 20/09/2004, 15h55
  3. 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
  4. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 19h08

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