Fusion de deux liste simplement chaine

Bonjour,

je veux faire fusion de deux liste simplement chaine

a condition que la liste 1 est trier coissant

de meme pour la liste 2

j'ai base sur le principe de la fusion pour le tableau

mais ca ne marche pas

[CODE]
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct noeud
{
int info;
struct noeud *suivant;
}noeud;

typedef struct
{
noeud *tete;
}list;

void init(list *l)
{
l->tete=NULL;
}

void inserer_fin(list *l,int x)
{
noeud *e;
e=(noeud*)malloc(sizeof(noeud));
noeud *parcour=l->tete;
e->info=x;
e->suivant=NULL;
if(l->tete==NULL)
l->tete=e;
else
{
while(parcour->suivant!=NULL)
{
parcour=parcour->suivant;
}
parcour->suivant=e;
}
}

void affiche(list l)
{
noeud *parcour=l.tete;
while(parcour!=NULL)
{
printf("%7d",parcour->info);
parcour=parcour->suivant;
}
}

void fusioner(list *l1,list *l2,list *l3) // le probleme
{
noeud *parcour1=l1->tete;
noeud *parcour2=l2->tete;
noeud *parcour3=l3->tete;
while((parcour1!=NULL)&&(parcour2!=NULL))
{
if(parcour1->info<parcour2->info)
{
parcour3->info=parcour1->info;
parcour3=parcour3->suivant;
parcour1=parcour1->suivant;
}
else
{parcour3->info=parcour2->info;
parcour3=parcour3->suivant;
parcour2=parcour2->suivant;
}
}
while(parcour1!=NULL)
{
parcour3->info=parcour1->info;
parcour3=parcour3->suivant;
parcour1=parcour1->suivant;
}
while(parcour2!=NULL)
{
parcour3->info=parcour2->info;
parcour3=parcour3->suivant;
parcour2=parcour2->suivant;
}
}

void main()
{
int v,n,i,n1,v1;
list l1,l2,l3;
init(&l1);
init(&l2);
init(&l3);
printf(" donner la premiere liste\n :");
printf(" donner les nombres de noeud :");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("donner la valeur :");
scanf("%d",&v);
inserer_fin(&l1,v);

}
printf(" donner la deuxieme liste\n :");
printf(" donner les nombres de noeud :");
scanf("%d",&n1);
for(i=0;i<n1;i++)
{
printf("donner la valeur :");
scanf("%d",&v1);
inserer_fin(&l2,v1);
}
fusioner(&l1,&l2,&l3);
affiche(l3);
}
/CODE

pouvez m'aidez
Configuration: Windows XP
Firefox 3.5.7

2 réponses

  • Votes
  • Date
  • Date décroissante
  1. bonjour,

    pour les balises code, c'est avec "< code >" pas "[ code ]" (sans espaces) (bouton avec gras italique, souligné).

    Ensuite concernant ton code, le principe a l'air correct, mais je ne peux que te conseiller d'utiliser la fonction "Inserer_tete" que tu as crées pour ajouter les noeud à list3 . Tu as codé la manière correcte de le faire, alors il faut justement l'utiliser, car aucun noeud n'est correctement crée pour list3.
    1. Voici un code qui pourrai t'aider :
      #include<stdio.h>
      #include<stdlib.h>
      #include<string.h>
      typedef struct elmt elmt;
      struct elmt
      {
      char val;
      struct elmt*suiv;
      };
      typedef elmt*llist;

      llist ajouter_debut(llist l, char valo)
      {
      elmt *nouveau=malloc(sizeof(elmt));
      nouveau->val=valo;
      nouveau->suiv=l;
      return nouveau;
      }
      void afficher(llist l)
      {
      llist temp=l;
      if(temp==NULL)
      printf(NULL);
      while(temp!=NULL)
      {
      printf("%c -> ",temp->val);
      temp=temp->suiv;
      }
      if(temp==NULL)
      printf("NULL");
      }

      llist ajouter_fin(llist l1,char valeur)
      {
      elmt * liste=malloc(sizeof(elmt));
      liste->val=valeur;
      liste->suiv=NULL;
      if(l1==NULL)
      return liste;
      else
      {
      llist temp=l1;
      while(temp->suiv!=NULL)
      {temp=temp->suiv;}
      temp->suiv=liste;
      return l1;
      }

      }
      llist fusionner(llist la,llist lo)
      {
      llist temp1=la;
      llist temp2=lo;
      if(temp1==NULL)
      {
      return temp2;
      }
      else if(temp2==NULL)
      {
      return temp1;
      }
      else if ((temp1->val) <= (temp2->val))
      {
      temp1->suiv = fusionner(temp1->suiv,temp2);
      return(temp1);
      }
      else
      {
      temp2->suiv = fusionner(temp1,temp2->suiv);
      return(temp2);
      }
      }
      int main()
      {
      printf(" Copyright %c 2013 / R%calis%c par OUALIDOS\n",184,130,130);
      llist l1=NULL,l2=NULL,l=NULL;
      l1=ajouter_debut(l1,'h');
      l1=ajouter_debut(l1,'l');
      l1=ajouter_debut(l1,'a');
      puts("liste 1 : \n\n");
      afficher(l1);
      l2=ajouter_debut(l2,'g');
      l2=ajouter_debut(l2,'d');
      l2=ajouter_debut(l2,'b');
      printf("\n");
      puts("\nliste 2 : \n\n");
      afficher(l2);
      l=fusionner(l1,l2);
      printf("\n");
      printf("\n");
      printf("\nliste fusionn%ce : \n\n",130);
      afficher(l);
      printf("\n");
      free(l1);
      free(l2);
      free(l);

      }
      1. bah c po la peine de declarer
        la biblio <string.h>
      2. et c'était peut-être pas la peine de répondre à un message de plus de 3 ans