begin process at 2010 02 10 06:58:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Algorithme

 > 

Maths

 > 

Probleme de tri par insertion dans une liste chainée


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme de tri par insertion dans une liste chainée

mercredi 24 mai 2006 à 14:56:30 | Probleme de tri par insertion dans une liste chainée

greg505

Bonjour,

J'ai une liste chainée de :

[fixed]  pointeur_ligne_top = ^t_ligne_top;
  t_ligne_top=record
    page:string[100];
    compteur:integer;
    suivant:pointeur_ligne_top;
    precedent:pointeur_ligne_top;
  end;[/fixed]

J'essaye de faire un tri par insertion, tri decroissant par rapport au "compteur".

Ma demarche :

Donc, si le compteur de la valeur actuelle (tmp^.compteur) est superieur au compteur precedent (tmp^.precedent^.compteur)

Alors, il va faloir refaire les liens de l'enregistrement actuel (tmp) pour l'inserer au bon endroit.

Pour cela, j'appelle ma 2eme fonction qui detecte cette endroit (objet_top_min) dans la partie basse de la liste.... puis je refais les liens.

Si tmp^.compteur est superieur a tous les compteurs de la partie basse, alors, je l'insere au tout debut et je redefinie la tete de la liste (tete_top) sinon, je l'inserer entre 2 valeurs....

Au niveau du code, j'arrive à ca :

function top_min_insertion(var tete_top:pointeur_ligne_top;val:integer):pointeur_ligne_top;
var
  tmp : pointeur_ligne_top;
begin
  tmp := tete_top;

while ((tmp^.compteur > val) and (tmp^.suivant<>nil)) do
  begin
    tmp := tmp^.suivant;
  end;

  result := tmp^.precedent;
end;

procedure top_tri_insertion(var tete_top:pointeur_ligne_top);
var
  tmp: pointeur_ligne_top;
  objet_top_min : pointeur_ligne_top;
begin

  tmp := tete_top^.suivant;

  while tmp <> nil do
    begin

      if tmp^.compteur > tmp^.precedent^.compteur then
        begin

          objet_top_min := top_min_insertion(tete_top,tmp^.compteur);

          tmp^.precedent^.suivant := tmp^.suivant;

          if ((tmp^.compteur > tete_top.compteur) or (objet_top_min = nil)) then
            begin
              tmp^.suivant := tete_top;
              tmp^.precedent := nil;
              tete_top^.precedent := tmp;
              tete_top := tmp;
            end
          else
            begin
              tmp^.suivant := objet_top_min^.suivant;
              tmp^.precedent := objet_top_min;

              objet_top_min^.suivant^.precedent := tmp;
              objet_top_min^.suivant := tmp;
            end;
        end;

      //Form1.Memo1.Lines.Add(tmp^.page);
      tmp := tmp^.suivant;

    end;
    ShowMessage('Fin du tri');
end;


Et voila le resultat d'un tri. En 1er, il y a la liste non triée puis à la suite, il y a la liste "triée" (tout en bas...), Vous verrez que ca a zappé les 3/4 des valeurs...

http://www.gregserveur.com/test/stats_1.html (218 Ko)

MERCI de votre aide, car la je desespère. J'y ai passé la nuit et je trouve toujours pas.
jeudi 25 mai 2006 à 23:37:39 | Re : Probleme de tri par insertion dans une liste chainée

Forman

procedure tri_insertion(var p:pointeur_ligne_top);
var
  q,r,s:pointeur_ligne_top;
begin
  q:=p;
  while Assigned(q.suivant) do begin
    r:=q.suivant;
    s:=r;
    while Assigned(r.precedent) and (r.precedent.compteur>s.compteur) do
      r:=r.precedent;
    if r<>s then begin
      q.suivant:=s.suivant;
      if Assigned(s.suivant) then
        s.suivant.precedent:=q;
      if Assigned(r.precedent) then begin
        r.precedent.suivant:=s;
        s.precedent:=r.precedent;
      end else begin
        p:=s;
        s.precedent:=nil;
      end;
      r.precedent:=s;
      s.suivant:=r;
    end else
      q:=q.suivant;
  end;
end;


Ca devrait marcher. Le problème de ton code, c'est que tu avançais dans la liste même si le dernier élément dont tu t'es occupé (temp) avait été déplacé vers la tête. Or, si c'est le cas, tu ne dois pas avancer dans la liste car en ayant déplacé un élément vers la tête, ça t'a déjà fait avancer (je ne sais pas si c'est très clair)...
Dans ma fonction, c'est le test
if r<>s
qui s'occupe de vérifier si c'est le cas ou non.

[img]http://www.eleves.ens.fr/home/feuvrier/signature.jpg[/img]


Cette discussion est classée dans : ligne, tete, compteur, top, tmp


Répondre à ce message

Sujets en rapport avec ce message

compteur de ligne selon sa couleur dans un richedit [ par alcat2002 ] Bonjour a tous!Je suis sous delphi 7.Voila j'ai un richedit, dont les lignes changent de couleur.En face de chaque ligne, un label pour faire un petit Modifier des données dans un endroit precis dans un txt [ par nebularis ] Salut a tous,Je cherches un moyen de modifier des données dans un fichier TXT, ci-dessous c est ce j utiliser pour afficher les données qui se trouve Onclick sur une ligne d'un Trichedit [ par vincentstryckmans ] Bonjour, Je souhaite que l'event onclick d'un trichedit ne se réalise que sur une des lignes du richtedit. Comment faire svp ? Faut il un Trichedit a Ecrire dans un fichier texte à un endroit précis [ par couf ] Bonjour, J'ai un fichier texte qui à 34 lignes je souhaites en réécrire un nouveau qui remplace à partire du caractère 22 de la ligne  8 10 caract Mettre en couleur une ligne dans une combobox [ par dimdidi ] Bonjour,Je voudrais pouvoir mettre en couleur une ligne dans une combobox. du genre ComboBox.Item[1].color=clBlack;J'ai aussi regardé ComboBoxEx mais Rajouter une chaine de caractère en début de ligne d'un fichier texte [ par Gastounelli ] Tout est dit dans le sujet. J'en suis au niveau de lire chaque ligne du fichier    while not Eof(NomFicRefTxt)do      begin      Readln(NomFicRefTxt,C Passer a la ligne d'un DBGrid [ par develomagaly ] Bonjour,J'ai un  DBGRID sur une fiche mais il y a rien dedans ( pas de nom de colonne)J'effectue une requette SQL qui va me chercher les libellé à met Ajouter une ligne à la fin d'un dbgrid pour afficher les totaux des elements d'une colonne [ par kam81 ] Bonjour,Est il possible d'ajouter une ligne  à la fin d'un dbgrid qui sera semblable à une colonne mais de forme horizontale pour y afficher le total combobox : afficher la premiere ligne [ par deubal ] bonjour,voila dans mon appli j'ai plusieurs combo qui se remplissent avec des requetes. Tout fonctionne bien puisque le resultat des requetes se charg Ajouter une ligne dans un DBGrid [ par djjonabee6 ] Bonjour à tous, j'aimerais pouvoir ajouter une ligne dans un DBGrid qui serait en fait la somme des valeurs que j'ai dans une colonne... Comment dois


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales