Fusion de deux liste simplement chaine

mb42 Messages postés 553 Statut Membre -  
Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
     
    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.
    0
  2. oualidos
     
    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);

    }
    0
    1. oualidos
       
      bah c po la peine de declarer
      la biblio <string.h>
      0
    2. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
       
      et c'était peut-être pas la peine de répondre à un message de plus de 3 ans
      0