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

  FORUM HardWare.fr
  Programmation
  C++

  Fusion de 2 listes chainees

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fusion de 2 listes chainees

n°299253
Bleuarff
pouet
Posté le 01-02-2003 à 23:18:00  profilanswer
 

Je sais, c la base de la prog, mais là ça me saoule. J'ai traduit en C un algo qui marchait nickel en pascal, mais là il ne fonctionne pas. En gros, il reprend dans la liste finale toute la 2eme liste,et rajoute si besoin la fin de la 1ere. Aidez-moi si ya une erreur de logique dans cet algorithme:
 

Code :
  1. void fusion( ptr_elem liste1, ptr_elem liste2, ptr_elem *liste)
  2. {
  3. ptr_elem p=liste1,
  4.    q=liste2,
  5.    l=NULL;
  6. if ( (liste1==NULL) && (liste2!=NULL) )//si une des listes est nulle,
  7. {
  8.  *liste=liste2;
  9. }
  10. else if ( (liste2==NULL) && (liste1!=NULL) )// liste est egale a l'autre
  11. {
  12.  *liste=liste1;
  13. }
  14. else if ( (liste1== NULL) && (liste2==NULL) )// les 2 listes sont vides, liste est vide
  15. {
  16.  *liste=NULL;
  17. }
  18. else // si les 2 listes sont définies
  19. {
  20.  if (p->nb <= q->nb) // comparaison des tetes de listes
  21.  {
  22.   *liste=p;
  23.   if (p->nb = q->nb) // si egalité, on decale les 2 pointeurs
  24.   {     //pour n'inserer qu'un seul element.
  25.    q=q->suiv;
  26.   }
  27.   p=p->suiv;
  28.  }
  29.  else // ( p->nb > q->nb)
  30.  {
  31.   *liste=q;
  32.   q=q->suiv;
  33.  }
  34.  l=*liste;
  35.  while ( (p!=NULL) && (q!=NULL) ) //parcours alterné des 2 listes
  36.  {
  37.   if (p->nb <= q->nb) // insertion de l'element de liste1
  38.   {
  39.    l->suiv=p;
  40.    if (p->nb = q->nb) //decalage pour ne pas inserer 2 elements egaux
  41.    {
  42.     q=q->suiv;
  43.    }
  44.    p=p->suiv;
  45.   }
  46.   else //insertion de l'element de liste2
  47.   {
  48.    l->suiv=q;
  49.    q=q->suiv;
  50.   }
  51.   l=l->suiv;
  52.  }
  53.  //une des 2 listes est finie => on recopie la fin de l'autre a la suite de la liste finale
  54.  if (p==NULL)
  55.  {
  56.   l->suiv=q;
  57.  }
  58.  else
  59.  {
  60.   l->suiv=p;
  61.  }
  62. }
  63. }


---------------
©2008 Bleuarff Corp.
mood
Publicité
Posté le 01-02-2003 à 23:18:00  profilanswer
 

n°299255
Taz
bisounours-codeur
Posté le 01-02-2003 à 23:26:38  profilanswer
 

si c'est un pb d'algo, donne ton algo, parce que ton code est assez inbuvable à cette heure ci

n°315885
Bleuarff
pouet
Posté le 23-02-2003 à 16:41:04  profilanswer
 

L'algo n'aurait servi à rien, l'erreur classique du débutant qui arrive du pascal: "=" au lieu de "==" dans une condition :o


---------------
©2008 Bleuarff Corp.
n°316058
Angel_Doog​las
Le dernier des humains
Posté le 23-02-2003 à 22:28:01  profilanswer
 

bleuarff a écrit :

L'algo n'aurait servi à rien, l'erreur classique du débutant qui arrive du pascal: "=" au lieu de "==" dans une condition :o


 
 
:heink:

n°316105
Majca Jala​su
Posté le 24-02-2003 à 01:05:55  profilanswer
 

bleuarff, là, tu ne crées rien du tout... Tu ne fais que jouer avec les pointeurs, rien de plus.
En clair, tu fous le bordel dans tes deux listes ;).
 
Essaie plutôt ça, je l'ai testé et ça fonctionne:

Code :
  1. void fusion(  ptr_elem p,  ptr_elem q,  ptr_elem &liste)
  2. {
  3. if (p == NULL)
  4. {
  5.  if (q == NULL) liste = NULL;
  6.  else   liste = p;
  7. }
  8. else if (q == NULL) liste = q;
  9. else         // si les 2 listes sont définies
  10. {
  11.  Elem *l = new Elem (0,NULL);                   // en considérant que ton constructeur est "Elem (nb, suiv)"  
  12.  liste = l;
  13.  while ( (p!=NULL) && (q!=NULL) )             // parcours alterné des 2 listes
  14.  {
  15.   if (p->nb <= q->nb)    // insertion de l'element de liste1
  16.   {
  17.    l->suiv = new Elem (p->nb, NULL);
  18.    if (p->nb == q->nb)   //decalage pour ne pas inserer 2 elements egaux
  19.    {
  20.     q = q->suiv;
  21.    }
  22.    p = p->suiv;
  23.   }
  24.   else       //insertion de l'element de liste2
  25.   {
  26.    l->suiv = new Elem (q->nb, NULL);
  27.    q = q->suiv;
  28.   }
  29.   l = l->suiv;
  30.  }
  31.  //une des 2 listes est finie => on recopie la fin de l'autre a la suite de la liste finale
  32.  while (p != NULL)
  33.  {
  34.   l->suiv = new Elem (p->nb, NULL);
  35.   p = p->suiv;
  36.  }
  37.  while (q != NULL)
  38.  {
  39.   l->suiv = new Elem (q->nb, NULL);
  40.   q = q->suiv;
  41.  }
  42.  l = liste;
  43.  liste = liste->suiv;
  44.  l->suiv = NULL;
  45.  delete l;
  46. }
  47. }


 
 
edit:  lol, je viens de remarquer que la question date du 01/02 :) mdr
J'espère que ça te servira encore ;)


Message édité par Majca Jalasu le 24-02-2003 à 01:10:58
n°316937
Bleuarff
pouet
Posté le 24-02-2003 à 22:19:47  profilanswer
 

Majca Jalasu a écrit :

bleuarff, là, tu ne crées rien du tout... Tu ne fais que jouer avec les pointeurs, rien de plus.
En clair, tu fous le bordel dans tes deux listes ;).
 
edit:  lol, je viens de remarquer que la question date du 01/02 :) mdr
J'espère que ça te servira encore ;)


 
Ct pour aujourd'hui :) Quant à ne rien creer c fait expres, je veux fusionner les 2 listes initiales, g pas besoin de les garder une fois que g la nouvelle.


---------------
©2008 Bleuarff Corp.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Fusion de 2 listes chainees

 

Sujets relatifs
Colf Fusion[OPEN GL] question sur les listes d'objets...
[C] quelqu'un aurais un cours sur les listes ?[ACCESS] Listes déroulantes
trie par fusion[Page Web] Fusion de pages en une seule.
[C] Listes chainées et allocation mémoire[C/C++] Select et listes chainees ;)
Plus de sujets relatifs à : Fusion de 2 listes chainees


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