Fusion de deux liste simplement chaine [Fermé]

Signaler
Messages postés
432
Date d'inscription
vendredi 17 octobre 2008
Statut
Membre
Dernière intervention
14 janvier 2014
-
Messages postés
3241
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
-
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

2 réponses

Messages postés
3241
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
600
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.
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);

}
bah c po la peine de declarer
la biblio <string.h>
Messages postés
3241
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
600
et c'était peut-être pas la peine de répondre à un message de plus de 3 ans