Fusion de 2 listes chainees

Fusion de 2 listes chainees - C++ - Programmation

Marsh Posté le 01-02-2003 à 23:18:00    

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.
Reply

Marsh Posté le 01-02-2003 à 23:18:00   

Reply

Marsh Posté le 01-02-2003 à 23:26:38    

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

Reply

Marsh Posté le 23-02-2003 à 16:41:04    

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.
Reply

Marsh Posté le 23-02-2003 à 22:28:01    

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:

Reply

Marsh Posté le 24-02-2003 à 01:05:55    

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
Reply

Marsh Posté le 24-02-2003 à 22:19:47    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed