Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1457 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[C / Algo] - Tri d'une liste chainée par nom [ résolu... oufff ! ]

n°266885
youdontcar​e
Posté le 11-12-2002 à 09:06:00  profilanswer
 

Reprise du message précédent :

_Maximus_ a écrit :

v devenir singléééé  :cry:

si tu détaillais un peu les endroits où tu es bloqué ... j'ai mis tout ce que tu avais à corriger dans mon post précédent. le code final ne devrait pas prendre plus d'une trentaine de lignes.
 
et quand je dis de recopier & debugger les exemples qsort() & co, c'est pas pour faire joli, c'est crucial. cf l'exemple dans la msdn : http://msdn.microsoft.com/library/ [...] _qsort.asp  
 
si tu veux comprendre l'algo, http://www.google.com/search?q=quicksort+explained . ce n'est pas indispensable pour son utilisation.

mood
Publicité
Posté le 11-12-2002 à 09:06:00  profilanswer
 

n°266887
_maximus_
Goret ptit con ^_^
Posté le 11-12-2002 à 09:15:43  profilanswer
 

youdontcare a écrit :

si tu détaillais un peu les endroits où tu es bloqué ... j'ai mis tout ce que tu avais à corriger dans mon post précédent. le code final ne devrait pas prendre plus d'une trentaine de lignes.
 
et quand je dis de recopier & debugger les exemples qsort() & co, c'est pas pour faire joli, c'est crucial. cf l'exemple dans la msdn : http://msdn.microsoft.com/library/ [...] _qsort.asp  
 
si tu veux comprendre l'algo, http://www.google.com/search?q=quicksort+explained . ce n'est pas indispensable pour son utilisation.


 
Merci  
ben deja ce qui va pas c'est que la taille de mon tableau j'en sais rien elle peut changer a chaque fois... d'ou l'interet d'avoir fait des liste chainee, alors si c pour le remettre dans un tableau ca perd tout son sens :/, et je sais pas comment faire un tableau dynamique...  
 
j'ai fait des recherche a propos de qsort, mais rien de t res concret..
 
 
je comprends pas grand choses aux arguements qu'il faut lui passer, ni pq... j'approfondirais bien le sujet, mais la ca presse, sinon ca va etre dmc, mon projet ... alors j'avais commencé avec bjone, un  truc puis ca bugue encore mais j'arrive pas a corriger... tu me proposes une autre facon de faire, mais j'arrive pas non plus alors je sais plus que faire ni quoi choisir...
 
je sais que vous etes pas ici pour faire le boulot a ma place, mais la... je capte vraiment plus rien.. et le fait que c urgent ca me stress encore plus
 
v peter un cable moi  :pt1cable:  
 
merci a+


---------------
Ptit con de goret je t'emmerde ^_^
n°266892
youdontcar​e
Posté le 11-12-2002 à 09:22:12  profilanswer
 

_Maximus_ a écrit :

la taille de mon tableau j'en sais rien elle peut changer a chaque fois... d'ou l'interet d'avoir fait des liste chainee, alors si c pour le remettre dans un tableau ca perd tout son sens :/

c'est un tableau temporaire. les données temporaires n'ont rien d'extraordinaire, même dans le cadre d'une liste chaînée. c'est le genre de stratagème qu'on peut utiliser pour sauvegarder la liste dans un fichier : stocker tous les pointeurs, remplacer les pSuivants & co par les indices dans le tableau ... bref.
 
en code, tout est une question de compromis, souvent entre vitesse / espace mémoire / complexité du code. je t'ai donné la solution qui me semble être la plus simple niveau 'complexité du code', si elle te semble plus compliquée que celle de bjone, utilise la sienne.

n°267030
bjone
Insert booze to continue
Posté le 11-12-2002 à 12:42:11  profilanswer
 

_Maximus_, poste les deux dernières versions du code des deux possibilités que l'on t'a proposé pour voir ce qui colle pas (histoire qu'on se base pas sur un vieux post)

n°267032
_maximus_
Goret ptit con ^_^
Posté le 11-12-2002 à 12:46:20  profilanswer
 

bjone a écrit :

_Maximus_, poste les deux dernières versions du code des deux possibilités que l'on t'a proposé pour voir ce qui colle pas (histoire qu'on se base pas sur un vieux post)


 
Merci, c'est plus la peine.. j'ai procédé autrement avec le tri a bulle, c'est barbare comme code mais ca marche
 
au lieux d'inverser les pSuivant et pPrecedant j'inverse carrément toute les données parce que apparement c cette inversion ki foirait le tout :
 
voila mon code a present :  
 

Code :
  1. void trinom(struct DATA * liste, int taille)
  2. {
  3. int ok, i;
  4.    struct DATA * elem1, * elem2;                              //elements a trier
  5.    elem1 = liste;                     //elem1 est le premier element de la liste
  6.    do
  7.    {
  8.     ok=0;
  9.       elem2 = elem1->pSuivant;                     //elem2 est le second element
  10.       while(elem2->pSuivant!=NULL){
  11.        if (strcmp(elem1->nom, elem2->nom)>0)
  12.          {
  13.           echange(elem1, elem2);
  14.          }
  15.          else
  16.          {
  17.           elem2 = elem2->pSuivant;
  18.          }
  19.       }
  20.       if(elem1->pSuivant->pSuivant==NULL) ok=1;
  21.  elem1=elem1->pSuivant;
  22.    }while (!ok);                                //tant que ok est different de 1
  23. }
  24. void echange(struct DATA * premier, struct DATA * second)
  25. {
  26. struct DATA * tampon;
  27.    strcpy(tampon->nom,premier->nom);
  28.    strcpy(tampon->prenom,premier->prenom);
  29.    strcpy(tampon->telephone,premier->telephone);
  30.    strcpy(tampon->adresse,premier->adresse);
  31.    strcpy(tampon->cp,premier->cp);
  32.    strcpy(tampon->ville,premier->ville);
  33.    strcpy(tampon->metier,premier->metier);
  34.    strcpy(premier->nom,second->nom);
  35.    strcpy(premier->prenom,second->prenom);
  36.    strcpy(premier->telephone,second->telephone);
  37.    strcpy(premier->adresse,second->adresse);
  38.    strcpy(premier->cp,second->cp);
  39.    strcpy(premier->ville,second->ville);
  40.    strcpy(premier->metier,second->metier);
  41.  
  42.    strcpy(second->nom,tampon->nom);
  43.    strcpy(second->prenom,tampon->prenom);
  44.    strcpy(second->telephone,tampon->telephone);
  45.    strcpy(second->adresse,tampon->adresse);
  46.    strcpy(second->cp,tampon->cp);
  47.    strcpy(second->ville,tampon->ville);
  48.    strcpy(second->metier,tampon->metier);
  49. }


 
 
m'enfin j'ai tjrs pas compris pq ca marchait pas simpelemtn en inversant les maillon , l'algo en lui meme etait juste a mon avis...
 
Merci pour ton aide
 
a+


---------------
Ptit con de goret je t'emmerde ^_^
n°267052
bjone
Insert booze to continue
Posté le 11-12-2002 à 13:17:56  profilanswer
 

:non: code de porc, ton prof va te déchirer.
 
tout l'intêret des (double) listes chaines c'est de manipuler les pointeurs suivants/précédents. tu est à coté du but de l'exercice (donc => 0). tu peux garder cette solution de coté si tu n'y arrives pas, mais tu auras autant de points que si tu rendais rien (enfin j'éxagére un petit peu).
 
poste le code tu tri par sélection, et du tri par qsort que tu as, qu'on puisse t'aider...

n°267053
bjone
Insert booze to continue
Posté le 11-12-2002 à 13:19:18  profilanswer
 

d'autant plus que dans ta routine d'échange, tu passes par une structure temporaire ... non allouée ...
résultat: si ça marche c'est par la voie du saint-esprit.

n°267062
bjone
Insert booze to continue
Posté le 11-12-2002 à 13:30:22  profilanswer
 

sinon le code "d'échange" sera le même avec le tri à bulle et sa variante par sélection.  
 
les deux cas particuliers de cet échange seront si un des éléments est/ou se retrouve premier ou dernier.
 
Dans le cas du premier y'a pas d'élément précédent, on ne doit pas essayer de mettre à jour le pointeur suivant de l'élément précédent, et fo modifier le pointeur racine.
 
Dans le cas du dernier y'a pas d'élément suivant, donc on ne doit pas essayer de mettre à jour le pointeur précédent de l'élément suivant.


Message édité par bjone le 11-12-2002 à 13:31:00
n°267148
_maximus_
Goret ptit con ^_^
Posté le 11-12-2002 à 14:59:26  profilanswer
 

Tout a fait d'accord, mais j'y suis pas arriver, et la mon cerveau il sature, c tout ce que j'ai trouvé pour m'en sortir :/  
 
sinon voila le dernier code que j'avais :  
 

Code :
  1. void TriNom(struct DATA *LC_result)
  2.   {
  3.        struct DATA *pMem, *pTmp, *pI, *pJ;
  4.    
  5.        pI=LC_result;
  6.    
  7.    
  8.        while(pI->pSuivant != NULL && pI->pSuivant->pSuivant!=NULL)
  9.        {
  10.         pMem=pI;
  11.             pJ=pI->pSuivant;
  12.      
  13.             while(pJ->pSuivant!=NULL)
  14.             {
  15.                if(strcmp(pJ->nom, pMem->nom)<0)
  16.                  {
  17.               pMem=pJ;
  18.                  }
  19.                  pJ=pJ->pSuivant;
  20.             }
  21.      
  22.             if(strcmp(pMem->nom, pI->nom)!=0)
  23.             {
  24.                  pI->pPrecedent->pSuivant=pMem;
  25.                  pI->pPrecedent=pMem;
  26.        
  27.                  pMem->pPrecedent->pSuivant=pMem->pSuivant;
  28.                  pMem->pSuivant->pPrecedent=pMem->pPrecedent;
  29.        
  30.                  pMem->pSuivant=pI;
  31.             }
  32.           pI=pI->pSuivant;
  33.        }
  34.    
  35.        getch();
  36.   }


 
mais ca trie pas correctement et il manque des maillions...  
j'ai tout essayer au moment d'inverser les pointeur, mais rien a faire...  
 
merci


---------------
Ptit con de goret je t'emmerde ^_^
n°267463
bjone
Insert booze to continue
Posté le 11-12-2002 à 18:02:01  profilanswer
 

bon comme j'ai déjà dit:
 
remplaçe if(strcmp(pMem->nom, pI->nom)!=0)  
par if( pMem != pI )

mood
Publicité
Posté le 11-12-2002 à 18:02:01  profilanswer
 

n°267466
bjone
Insert booze to continue
Posté le 11-12-2002 à 18:03:20  profilanswer
 

bjone a écrit :

alors dans le while, il faut:
 
while( pI->pSuivant != NULL && pI->pSuivant->pSuivant!=NULL )
 
qui est équivalent à:
 
while( pI->pSuivant && pI->pSuivant->pSuivant )
 
et encore par sécurité:
 
while( pI && pI->psuivant....
 
ça protège des bugs plus bas, et ça protège du cas ou il y a q'un seul élément....
 
pour le if:
 
if(strcmp(pMem, pI)!=0)
            {
                 pI->pSuivant=pMem->pSuivant;
                 pMem->pSuivant=pI;
         
}
 
vo mieux:
 
if( pMem != pI )
{
   
}
 
ensuite ton insertion est "fausse" :D
 
ton insertion doit faire:
 
// meilleur devant courant
courant->précédent->suivant = meilleur
courant->précédent = meilleur
 
// on "enlève" meilleur
meilleur->précédent->suivant = meilleur->suivant
meilleur->suivant->précédent = meilleur->précédent
 
// meilleur devant courant (suite)
meilleur->suivant=courant
 
et ceci doit gérer les cas spéciaux:
 
insetion devant le premier élément où le pointeur précédent est à NULL ( modifer le pointeur "racine" )
 
cas ou le meilleur est le dernier élément où le pointeur suivant est à NULL (sinon crash)


 
base toi sur ça.

n°267469
bjone
Insert booze to continue
Posté le 11-12-2002 à 18:07:23  profilanswer
 

ensuite comme tu peux avoir à modifier le premier, il faut que ton appel de routine ressemble à ça:
 
void TriNom(struct DATA **Premier)
 
///////////////////////////
 
ou à ça:
struct DATA *TriNom(struct DATA *Premier)
 
avec un appelle du style:
 
main()
{
 struct DATA *PremierElement;
 
..... Y'a plein d'éléments ajoutés dans la double liste chainés
.....
 
 
 PremierElement=TriNom(PremierElement);
}
 
porké ? passke un élément peux prendre la plaçe du premier élement, et donc le pointeur "racine" peut avoir à être modifié.
 
donc soit le pointeur "racine" tu le passes lui-même par pointeur (ou par référence si tu est en C++ :D), ou tu le retournes comme ça la fonction appellante pourra mettre à jour le pointeur racine de son coté.


Message édité par bjone le 11-12-2002 à 18:17:07
n°267493
bjone
Insert booze to continue
Posté le 11-12-2002 à 18:38:14  profilanswer
 

pour l'insertion ça doit ressembler à quelque chose du genre:
 
if( meilleur != courant )
{
   struct DATA *prec;
 
   /////////////////////
   // on "enlève" meilleur  
   meilleur->précédent->suivant = meilleur->suivant;
 
   // meilleur n'est pas le dernier
   if( meilleur->suivant )
      meilleur->suivant->précédent = meilleur->précédent;
 
   ////////
   prec=courant->précédent;
 
   if( prec )
     prec->suivant = meilleur;
   else
     racine = meilleur;
 
   meilleur->précédent = prec;
   courant->précédent = meilleur;
 
   meilleur->suivant=courant;  
}
 
en principe ça devrait ressembler à cela....

n°267501
Giz
Posté le 11-12-2002 à 18:51:51  profilanswer
 

jviens juste de faire ce TP cette semaine a mon école...cai trop easy ! :D
...si tu ve jte le fé, et avec plein de commentaire ds le code ! ;)
Jregarde ca ce soir et jte mail le tout demain aprem ! (source C)

n°267506
Giz
Posté le 11-12-2002 à 18:53:55  profilanswer
 

...et je vois deja ds ton enonce une maladresse :
NE JAMAIS déclaré les dimensions du tableau en dur ! tjs en #define ! (du - surtout pour ce type de structure ...)


Message édité par Giz le 11-12-2002 à 18:54:30
n°267519
_maximus_
Goret ptit con ^_^
Posté le 11-12-2002 à 19:09:50  profilanswer
 

bjone a écrit :

pour l'insertion ça doit ressembler à quelque chose du genre:
 
if( meilleur != courant )
{
   struct DATA *prec;
 
   /////////////////////
   // on "enlève" meilleur  
   meilleur->précédent->suivant = meilleur->suivant;
 
   // meilleur n'est pas le dernier
   if( meilleur->suivant )
      meilleur->suivant->précédent = meilleur->précédent;
 
   ////////
   prec=courant->précédent;
 
   if( prec )
     prec->suivant = meilleur;
   else
     racine = meilleur;
 
   meilleur->précédent = prec;
   courant->précédent = meilleur;
 
   meilleur->suivant=courant;  
}
 
en principe ça devrait ressembler à cela....


 
J'ai fait comme tu as dit, mais ca fait une boucle infinie maintenant :
 

Code :
  1. void TriNom(struct DATA *LC_result)
  2. {
  3.    struct DATA *pMem, *pTmp, *pI, *pJ;
  4.    struct DATA *prec, *pDeb;
  5.    pI=LC_result;
  6.    pDeb=LC_result;
  7.    while(pI->pSuivant != NULL && pI->pSuivant->pSuivant!=NULL)
  8.    {
  9.  pMem=pI;
  10.       pJ=pI->pSuivant;
  11.       while(pJ->pSuivant!=NULL)
  12.       {
  13.        if(strcmp(pJ->nom, pMem->nom)<0)
  14.    pMem=pJ;
  15.          pJ=pJ->pSuivant;
  16.       }
  17.       if( pMem != pI )
  18.       {
  19.          pMem->pPrecedent->pSuivant = pMem->pSuivant;
  20.          if(pMem->pSuivant!=NULL)
  21.         pMem->pSuivant->pPrecedent = pMem->pPrecedent;
  22.          prec=pI->pPrecedent;
  23.           if( prec )
  24.        prec->pSuivant = pMem;
  25.    else
  26.      pDeb = pMem;
  27.    pMem->pPrecedent = prec;
  28.      pI->pPrecedent = pMem;
  29.    pMem->pSuivant=pI;
  30.       }
  31.     pI=pMem;
  32.    }
  33. }


 


---------------
Ptit con de goret je t'emmerde ^_^
n°267521
_maximus_
Goret ptit con ^_^
Posté le 11-12-2002 à 19:12:31  profilanswer
 

Giz a écrit :

jviens juste de faire ce TP cette semaine a mon école...cai trop easy ! :D
...si tu ve jte le fé, et avec plein de commentaire ds le code ! ;)
Jregarde ca ce soir et jte mail le tout demain aprem ! (source C)


 
C'est super sympa de proposer, mais c'est trop tard :/ c'est demain qu'on remet le tout... maintnant chui entrain d'essayer de faire comme bjone m'explique juste pour le principe de pas me laisser battre par cette @##{#@ de machine...
 
mais merci quand meme c'est sympa d'avoir proposé,... mais si tu as le temps tu peux tjrs me l'envoyer quand meme ca m'interresse de voir comment tu as fait.  
 
Merci a toi
 


---------------
Ptit con de goret je t'emmerde ^_^
n°267623
bjone
Insert booze to continue
Posté le 11-12-2002 à 21:08:52  profilanswer
 

_Maximus_ a écrit :


 
J'ai fait comme tu as dit, mais ca fait une boucle infinie maintenant :
 

Code :
  1. void TriNom(struct DATA *LC_result)
  2. {
  3.    struct DATA *pMem, *pTmp, *pI, *pJ;
  4.    struct DATA *prec, *pDeb;
  5.    pI=LC_result;
  6.    pDeb=LC_result;
  7.    while(pI->pSuivant != NULL && pI->pSuivant->pSuivant!=NULL)
  8.    {
  9.  pMem=pI;
  10.       pJ=pI->pSuivant;
  11.       while(pJ->pSuivant!=NULL)
  12.       {
  13.        if(strcmp(pJ->nom, pMem->nom)<0)
  14.    pMem=pJ;
  15.          pJ=pJ->pSuivant;
  16.       }
  17.       if( pMem != pI )
  18.       {
  19.          pMem->pPrecedent->pSuivant = pMem->pSuivant;
  20.          if(pMem->pSuivant!=NULL)
  21.         pMem->pSuivant->pPrecedent = pMem->pPrecedent;
  22.          prec=pI->pPrecedent;
  23.           if( prec )
  24.        prec->pSuivant = pMem;
  25.    else
  26.      pDeb = pMem;
  27.    pMem->pPrecedent = prec;
  28.      pI->pPrecedent = pMem;
  29.    pMem->pSuivant=pI;
  30.       }
  31.     pI=pMem;
  32.    }
  33. }


 
 


 
presque....
 
je dirais:
 
while(
{
  if( pMem != pI )
  {
    ....
  }
  else
    pI=pI->suivant;
}
 
si tu rentres dans le if, le meilleur étant inséré devant le courant, il faudra encore "retester" le courant par rapport avec ses suivants.
 
si tu ne rentres pas dans le if, le courant est bien à sa place on peut passer au suivant....
 
////
 
tu n'a pas l'air d'avoir compris cette histoire de pointeur "racine" qui pointe sur le premier.
 
le pointeur "deb" tu le retournes, afin que la fonction appellante puisse mettre à jour sur le pointeur racine de son coté...

n°267626
_maximus_
Goret ptit con ^_^
Posté le 11-12-2002 à 21:24:37  profilanswer
 

bjone a écrit :


 
presque....
 
je dirais:
 
while(
{
  if( pMem != pI )
  {
    ....
  }
  else
    pI=pI->suivant;
}
 
si tu rentres dans le if, le meilleur étant inséré devant le courant, il faudra encore "retester" le courant par rapport avec ses suivants.
 
si tu ne rentres pas dans le if, le courant est bien à sa place on peut passer au suivant....
 
////
 
tu n'a pas l'air d'avoir compris cette histoire de pointeur "racine" qui pointe sur le premier.
 
le pointeur "deb" tu le retournes, afin que la fonction appellante puisse mettre à jour sur le pointeur racine de son coté...


 
 
Bon oui, j'avais oublié de mettre le pI=pI->pSuivant, logique que ca bouclait , mea culpa...
 
sinon j'ai fait comme t'as dit, et ca donne ce ci :  
 

Code :
  1. struct DATA * TriNom(struct DATA *LC_result)
  2. {
  3.    struct DATA *pMem, *pTmp, *pI, *pJ;
  4.    struct DATA *prec, *pDeb;
  5.    pI=LC_result;
  6.    pDeb=LC_result;
  7.    while(pI->pSuivant != NULL && pI->pSuivant->pSuivant!=NULL)
  8.    {
  9.  pMem=pI;
  10.       pJ=pI->pSuivant;
  11.       while(pJ->pSuivant!=NULL)
  12.       {
  13.        if(strcmp(pJ->nom, pMem->nom)<0)
  14.    pMem=pJ;
  15.          pJ=pJ->pSuivant;
  16.       }
  17.       if( pMem != pI )
  18.       {
  19.          pMem->pPrecedent->pSuivant = pMem->pSuivant;
  20.          if(pMem->pSuivant!=NULL)
  21.         pMem->pSuivant->pPrecedent = pMem->pPrecedent;
  22.          prec=pI->pPrecedent;
  23.           if( prec )
  24.        prec->pSuivant = pMem;
  25.    else
  26.      pDeb = pMem;
  27.    pMem->pPrecedent = prec;
  28.      pI->pPrecedent = pMem;
  29.    pMem->pSuivant=pI;
  30.       }
  31.       else
  32.        pI=pI->pSuivant;
  33.     pI=pMem; //pas sur de la position
  34.    }
  35.    return pDeb;
  36. }


 
et dans le main.c je fais ptr=TriNom(ptr);
 
ca boucle plus, ca affiche tous les enregistrement, mais pas encore trié...  
 
voila comment sont disposé les nom au depart :
 

jklz                
defz
ghiz
abcz
mnoz


 
et il ressortent dan le meme ordre...
 
 :pt1cable:


---------------
Ptit con de goret je t'emmerde ^_^
n°267712
bjone
Insert booze to continue
Posté le 12-12-2002 à 00:12:59  profilanswer
 

le:
 

Code :
  1. pI=pMem; //pas sur de la position


 
est de trop.

n°267714
bjone
Insert booze to continue
Posté le 12-12-2002 à 00:15:59  profilanswer
 

d'ailleurs je comprends pas comment ça a fait pour pas partir en boucle infinie  :heink:


Message édité par bjone le 12-12-2002 à 00:16:07
n°267719
bjone
Insert booze to continue
Posté le 12-12-2002 à 00:23:13  profilanswer
 

sinon l'écriture peut se simplifier:
 

Code :
  1. struct DATA * TriNom(struct DATA *LC_result)
  2.   {
  3.        struct DATA *pMem, *pTmp, *pI, *pJ;
  4.        struct DATA *prec, *pDeb;
  5.    
  6.        pI=LC_result;
  7.        pDeb=LC_result;
  8.    
  9.    
  10.        while(pI->pSuivant != NULL && pI->pSuivant->pSuivant!=NULL)
  11.        {
  12.         pMem=pI;
  13.             pJ=pI->pSuivant;
  14.      
  15.             while(pJ->pSuivant!=NULL)
  16.             {
  17.                if(strcmp(pJ->nom, pMem->nom)<0)
  18.               pMem=pJ;
  19.        
  20.                  pJ=pJ->pSuivant;
  21.             }
  22.             if( pMem != pI )
  23.             {
  24.                  pMem->pPrecedent->pSuivant = pMem->pSuivant;
  25.        
  26.                  if(pMem->pSuivant!=NULL)
  27.                   pMem->pSuivant->pPrecedent = pMem->pPrecedent;
  28.        
  29.                  prec=pI->pPrecedent;
  30.        
  31.                   if( prec )
  32.                  prec->pSuivant = pMem;
  33.             else
  34.                 pDeb = pMem;
  35.        
  36.             pMem->pPrecedent = prec;
  37.               pI->pPrecedent = pMem;
  38.             pMem->pSuivant=pI;
  39.             }
  40.             else
  41.                pI=pI->pSuivant;
  42.      
  43.           pI=pMem;//pas sur de la position
  44.        }
  45.        return pDeb;
  46.   }


 
par ça:

Code :
  1. struct DATA * TriNom(struct DATA *Racine)
  2.   {
  3.        struct DATA *Courant; 
  4.    
  5.        Courant=Racine;
  6.        while( Courant->pSuivant ) // autre bug: pour tester jusqu'à l'avant dernier, Courant->pSuivant->pSuivant est de trop
  7.        {
  8.             struct DATA *Curseur,*Meilleur;
  9.             Curseur=Courant->pSuivant;
  10.             Meilleur=Courant;     
  11.             while( Curseur ) // petit bug ici, Curseur et pas Curseur->pSuivant
  12.             {
  13.                if( strcmp(Curseur->nom, Meilleur->nom) < 0 )
  14.                   Meilleur=Curseur;
  15.        
  16.                Curseur=Curseur->pSuivant;
  17.             }
  18.             if( Meilleur != Courant )
  19.             {
  20.                  Meilleur->pPrecedent->pSuivant = Meilleur->pSuivant;
  21.        
  22.                  if( Meilleur->pSuivant )
  23.                     Meilleur->pSuivant->pPrecedent = Meilleur->pPrecedent;
  24.              
  25.                  if( Courant->pPrecedent )
  26.                     Courant->pPrecedent->pSuivant = Meilleur;
  27.                  else
  28.                     Racine = Meilleur;
  29.        
  30.                  Meilleur->pPrecedent = Courant->Precedent;
  31.                  Courant->pPrecedent = Meilleur;
  32.                  Meilleur->pSuivant= Courant;
  33.             }
  34.             else
  35.                Courant = Courant->pSuivant;
  36.        }
  37.        return Racine;
  38.   }


 
j'ai pas tester le code, mais le truc qui marche doit en être pas loin....


Message édité par bjone le 12-12-2002 à 00:32:03
n°267722
_maximus_
Goret ptit con ^_^
Posté le 12-12-2002 à 00:36:54  profilanswer
 

bjone a écrit :

sinon l'écriture peut se simplifier:
 

Code :
  1. struct DATA * TriNom(struct DATA *LC_result)
  2.   {
  3.        struct DATA *pMem, *pTmp, *pI, *pJ;
  4.        struct DATA *prec, *pDeb;
  5.    
  6.        pI=LC_result;
  7.        pDeb=LC_result;
  8.    
  9.    
  10.        while(pI->pSuivant != NULL && pI->pSuivant->pSuivant!=NULL)
  11.        {
  12.         pMem=pI;
  13.             pJ=pI->pSuivant;
  14.      
  15.             while(pJ->pSuivant!=NULL)
  16.             {
  17.                if(strcmp(pJ->nom, pMem->nom)<0)
  18.               pMem=pJ;
  19.        
  20.                  pJ=pJ->pSuivant;
  21.             }
  22.             if( pMem != pI )
  23.             {
  24.                  pMem->pPrecedent->pSuivant = pMem->pSuivant;
  25.        
  26.                  if(pMem->pSuivant!=NULL)
  27.                   pMem->pSuivant->pPrecedent = pMem->pPrecedent;
  28.        
  29.                  prec=pI->pPrecedent;
  30.        
  31.                   if( prec )
  32.                  prec->pSuivant = pMem;
  33.             else
  34.                 pDeb = pMem;
  35.        
  36.             pMem->pPrecedent = prec;
  37.               pI->pPrecedent = pMem;
  38.             pMem->pSuivant=pI;
  39.             }
  40.             else
  41.                pI=pI->pSuivant;
  42.      
  43.           pI=pMem;//pas sur de la position
  44.        }
  45.        return pDeb;
  46.   }


 
par ça:

Code :
  1. struct DATA * TriNom(struct DATA *Racine)
  2.   {
  3.        struct DATA *Courant; 
  4.    
  5.        Courant=Racine;
  6.        while( Courant->pSuivant ) // autre bug: pour tester jusqu'à l'avant dernier, Courant->pSuivant->pSuivant est de trop
  7.        {
  8.             struct DATA *Curseur,*Meilleur;
  9.             Curseur=Courant->pSuivant;
  10.             Meilleur=Courant;     
  11.             while( Curseur ) // petit bug ici, Curseur et pas Curseur->pSuivant
  12.             {
  13.                if( strcmp(Curseur->nom, Meilleur->nom) < 0 )
  14.                   Meilleur=Curseur;
  15.        
  16.                Curseur=Curseur->pSuivant;
  17.             }
  18.             if( Meilleur != Courant )
  19.             {
  20.                  Meilleur->pPrecedent->pSuivant = Meilleur->pSuivant;
  21.        
  22.                  if( Meilleur->pSuivant )
  23.                     Meilleur->pSuivant->pPrecedent = Meilleur->pPrecedent;
  24.              
  25.                  if( Courant->pPrecedent )
  26.                     Courant->pPrecedent->pSuivant = Meilleur;
  27.                  else
  28.                     Racine = Meilleur;
  29.        
  30.                  Meilleur->pPrecedent = Courant->Precedent;
  31.                  Courant->pPrecedent = Meilleur;
  32.                  Meilleur->pSuivant= Courant;
  33.             }
  34.             else
  35.                Courant = Courant->pSuivant;
  36.        }
  37.        return Racine;
  38.   }


 
j'ai pas tester le code, mais le truc qui marche doit en être pas loin....


 
Toujours rien  [:spamafote]  il trie pas...
fin bon s'pas grave, v garder ma solution pourrie, ca ira avec ca, c'est deja grace a toi que j'ai pu la trouver..
 
Bon! Merci bcp pour ton aide...
 
faudra que je m'y mette serieusement aux methodes de tri en C, pasque cai pas la joie la :/
 
 
Merci a+


---------------
Ptit con de goret je t'emmerde ^_^
n°267723
bjone
Insert booze to continue
Posté le 12-12-2002 à 00:38:59  profilanswer
 

fait voir ton code qui saisit/affiche.

n°267726
bjone
Insert booze to continue
Posté le 12-12-2002 à 00:41:53  profilanswer
 

cé pas possib, il doit se passer quelque chose, soit y devrait y avoir une boucle infine, soit le liste devrait être explosée...

n°267728
_maximus_
Goret ptit con ^_^
Posté le 12-12-2002 à 00:46:07  profilanswer
 

bjone a écrit :

fait voir ton code qui saisit/affiche.


 
Ca risque d'etre long, c'est un affichage avec une interface graphique etc... ;)
 
 
sinon en gros  ca se passe comme ca  
 
 
//saisie d'un mot clef au clavier
 
//Recherche dans un fichier
 
//Mise en memoire dans une liste chainée des enregistrements qui correspondent au mot clef, ma fonction recherche() retourne l'adresse de debut de la liste chainee
 
ptr=TriNom(ptr); //On 'trie'
 
//Et on affiche  
 
mais tout le code fonctionne parfaitement a part les tri,  [:spamafote] , tout les pPrecedent, et pSuivant sont ok... j'ai plusieur fois testé l'affichage de la liste chainee en partant du premier maillioon et en suite en partant du dernier et c bon... donc a ce niveau la il n'y a aucun doute.
 
Vala..
 
 


---------------
Ptit con de goret je t'emmerde ^_^
n°267729
_maximus_
Goret ptit con ^_^
Posté le 12-12-2002 à 00:48:01  profilanswer
 

bjone a écrit :

cé pas possib, il doit se passer quelque chose, soit y devrait y avoir une boucle infine, soit le liste devrait être explosée...


 
Ben il me sort les enregistrement tel qu'ils sont dans le fichier ( dans le meme ordre ) donc y a pas eu de tri...  
s'bizzare..


---------------
Ptit con de goret je t'emmerde ^_^
n°267730
bjone
Insert booze to continue
Posté le 12-12-2002 à 00:50:06  profilanswer
 

fait un test du style:
 
Courant = Racine;
 
while( Courant->Suivant )
{
  Affiche( Courant );
  Courant=Courant->Suivant;
}
 
while( Courant )
{
  Affiche( Courant );
  Courant=Courant->Precedent;
}
 
ça devrait permettre de tester le chainage...


Message édité par bjone le 12-12-2002 à 00:51:21
n°267731
bjone
Insert booze to continue
Posté le 12-12-2002 à 00:55:30  profilanswer
 

mon cerveau doit avoir du mal à simuler du C en ce moment :D  :p

n°267733
_maximus_
Goret ptit con ^_^
Posté le 12-12-2002 à 01:14:55  profilanswer
 

Putain chui q'un pov con...  
 
j'avais oublié qu'il fallait que je click sur trier par nom et que ca ne se faisais plus directement dans mon main pffffffffffffffffffffffffffffffffffffff
 
bon ben sinon ca marche, sauf que le premier enregistrement est vide  :heink:  
 
sinon le reste est bien trié


---------------
Ptit con de goret je t'emmerde ^_^
n°267735
_maximus_
Goret ptit con ^_^
Posté le 12-12-2002 à 01:23:01  profilanswer
 

Il m'affiche ceci :
 

Code :
  1. (ici vide)
  2. abcz
  3. defz
  4. ghiz
  5. jklz


 
et le 'mnoz'
ne s'affiche pas..
 
sinon c bien trié apparament, plus ke ce petit bug a resoudre


---------------
Ptit con de goret je t'emmerde ^_^
n°267737
_maximus_
Goret ptit con ^_^
Posté le 12-12-2002 à 01:30:41  profilanswer
 

c bon jai trouvé fallait mettre  
 
Courant->pSuivant dans le while et non Courant
 
Bon ben voila ca marche... big merci...
 
;)
 
 


---------------
Ptit con de goret je t'emmerde ^_^
n°269793
bjone
Insert booze to continue
Posté le 14-12-2002 à 21:18:29  profilanswer
 

arf

n°270057
_maximus_
Goret ptit con ^_^
Posté le 15-12-2002 à 18:50:06  profilanswer
 


 
hum.. ben oué desolé quoi ca arrive d'etre fatigué :'( et de faire n'importe quoi...
 
merci encore
a+


---------------
Ptit con de goret je t'emmerde ^_^
n°272124
_maximus_
Goret ptit con ^_^
Posté le 18-12-2002 à 13:26:02  profilanswer
 

salut bjone, c'est juste pour dire, que j'ai eu 85% a mon projet... donc c'est super.  
 
C'est en partie grace a ton aide, merci encore
 
a+


---------------
Ptit con de goret je t'emmerde ^_^
n°272209
bjone
Insert booze to continue
Posté le 18-12-2002 à 16:43:13  profilanswer
 

:jap:

n°274888
Giz
Posté le 22-12-2002 à 20:54:49  profilanswer
 

Désolai pour le retard mais j'a v difficilement accès au net !
Je te mail tous ca sans tarder cad :
Implémentation par rapport a ta liste doublement chainée des fonctions:
- Affichage de la liste
- Retirer un maillon de la liste
- Ajouter un maillon a la liste (= enregistrement)
- Trier la liste par nom
...bref les fonctions essentielles de traitement de liste chainée
 
PS: pour la fonction trier, je suis passez par un tableau de pointeur de taille dynamique (sizeof(nb_maillon))
Chaque case du tableau contient un pointeur sur un maillon. (tab[0] pointe sur le 1er maillon et Tab[N] le dernier)
Ensuite j'ai trié mon tab de pointeur et reaffecter les pointeur prec et suiv de chaque maillon a partir de ce tab de pointeur trié (ce qui me semble le plus logique, le plus simple/pratique surtout)

n°274889
_maximus_
Goret ptit con ^_^
Posté le 22-12-2002 à 20:59:35  profilanswer
 

Giz a écrit :

Désolai pour le retard mais j'a v difficilement accès au net !
Je te mail tous ca sans tarder cad :
Implémentation par rapport a ta liste doublement chainée des fonctions:
- Affichage de la liste
- Retirer un maillon de la liste
- Ajouter un maillon a la liste (= enregistrement)
- Trier la liste par nom
...bref les fonctions essentielles de traitement de liste chainée
 
PS: pour la fonction trier, je suis passez par un tableau de pointeur de taille dynamique (sizeof(nb_maillon))
Chaque case du tableau contient un pointeur sur un maillon. (tab[0] pointe sur le 1er maillon et Tab[N] le dernier)
Ensuite j'ai trié mon tab de pointeur et reaffecter les pointeur prec et suiv de chaque maillon a partir de ce tab de pointeur trié (ce qui me semble le plus logique, le plus simple/pratique surtout)


 
salut,
 
merci c sympa
c'est avec plaisir que je matterai toute tes fonction ;)
 
a+  :jap:


---------------
Ptit con de goret je t'emmerde ^_^
n°2139009
mlouk
Posté le 25-04-2012 à 15:12:05  profilanswer
 

après avoir trouvé ça:
 typedef enum boolean{
 TRUE,
 FALSE=!TRUE
 };
 ...
 fonction (...)
 {
  ...
  void *p=NULL;
  ...
  switch((!p))
  {
  case TRUE:
   ...
   break;
  case FALSE;
   ...
   break;
  }
 ...
 }
J'ai revu le code du tri d'une liste chainé. Je regrette que le code soit devenu moins lisible. :pfff:  
 /*fonction de teste pour le tri d'une liste*/
 int
 sort_test
         (void *p,int flag)
 {
         switch (flag)
         {
         case 0:
                 if (((h_contents *)p)->next && ((h_contents *)p)->pos.pos>((h_contents *)p)->next->pos.pos)
                         return 0;
                 break;
         default:
                 if (((h_contents *)p)->prev && ((h_contents *)p)->pos.pos<((h_contents *)p)->prev->pos.pos)
                         return 0;
                 break;
         }
         return 1;
 }
 /fonction pour le tri d'une liste*/
 void
 sort_contents
         (
                 void **h,
                 int (*test)(void *,int),
                 void *(*read_next)(void *),
                 void (*set_next)(void **,void *),
                 void *(*read_prev)(void *),
                 void (*set_prev)(void **,void *)
 )
 {
         /*DECLARATION*/
         void *ph,*after,*p,*pa,*pb;
         void **aptr[5]={&ph,&pa,&pb,&p,&h[0]},
                 **bptr[5]={&ph,&pb,&pa,&p,&h[0]};
         void ***plist[2]={aptr,bptr};
         void **ptrs[2][5]={     {&pa,&ph,&pb,&p,&h[0]},
                                 {&pa,&p,&pb,&ph,&h[0]}};
         void *(*___read___[2])(void *)={read_prev,read_next};
         void (*set[2])(void **,void *)={set_next,set_prev};
         unsigned short int i,j,tv[2]={3,0};
         int pset;
         /*CODE*/
         ph=h[0];
         while (ph)
         {
                 after=(*read_next)(ph);
                 pset=(*test)(ph,0);
                 while (!(*test)(ph,pset))
                 {
                         for (i=0;i<4;i++)
                                 if (i<2)
                                         plist[pset][1][0]
                                         =(*___read___[1-pset])(plist[pset][i][0]);
                                 else
                                         plist[pset][i][0]
                                         =(*___read___[(i-2)^pset])(plist[pset][0][0]);
                         for (j=0;j<4;j++)
                                 (*set[!(j<2)^pset])(plist[pset][tv[j%2]],plist[pset][j][0]);
                         if (ptrs[pset][0][0])
                                 (*set_prev)(ptrs[pset][0],ptrs[pset][1][0]);
                         if (ptrs[pset][2][0])
                                 (*set_next)(ptrs[pset][2],ptrs[pset][3][0]);
                         else
                                 ptrs[pset][4][0]=ptrs[pset][3][0];
                 }
                 ph=after;
         }
 }

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Ou puis-je trouver une liste de ts les pays pr mettre dans un combo?Serveur local impossible de passer des variable par url [résolu]
[ALGO] algo avec restriction de donnéepbr recherche en LDAP (newbie inside) [Résolu]
[Algo]ou trouver des infos sur le parcours des arbres ?[HTML]Comment recuperer ts les elt selectionnées d'une boîte liste?
Besoin d'un pro? : Problème de regexp (résolu)Délai dans la suppression des variables de session (résolu)
probleme avec un applet qui prend un fichier en parametre [resolu]comment recuperer le path du fichier qu'on execute ? [resolu]
Plus de sujets relatifs à : [C / Algo] - Tri d'une liste chainée par nom [ résolu... oufff ! ]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR