J'ai un problem de compilation
malek2212
Messages postés
23
Statut
Membre
-
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
lors qaund je vais compilier un program qui eclater une liste chainee en deux liste l'une contient les element pairs et l'autre contient les element impair
mon pc il devenu tres lent et je peux pas faire rien
je veut savoir pourqoui
voila c'est mon program je veux vous aidez
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
struct elm
{int val;
struct elm * suiv;
};
typedef struct elm *liste;
liste l,l1,l2,p;
/////////////////////////////////////////////////creation/////////////////////////////////////////////////////////////////
void creation(liste * l)
{int x,n,i;
printf("entrez le nombre d'elm de votre liste\n");
scanf("%d",&n);
for (i=1;i<=n;i++)
{printf("entrez la valeur de elm %d\n",i);
scanf("%d",&x);
p=new(elm);
p->val=x;
p->suiv=*l;
*l=p;
}
}
///////////////////////////////affichege///////////////////////////////
void affichage (liste l)
{liste p;
p=l;
while(p!=NULL)
{printf("%d\n",p->val);
p=p->suiv;
}
}
void eclater(liste l,liste *l1,liste *l2)
{
liste p;
while(l!=NULL)
{if(l->val %2== 0)
{
p=new(elm);
p->val=l->val;
p->suiv=*l1;
*l1=p;
}else
{p=new(elm);
p->val=l->val;
p->suiv=*l2;
*l2=p;
}
}l=l->suiv;
}
main()
{
creation(&l);
eclater(l,&l1,&l2);
affichage(l1);
affichage(l2);
}
lors qaund je vais compilier un program qui eclater une liste chainee en deux liste l'une contient les element pairs et l'autre contient les element impair
mon pc il devenu tres lent et je peux pas faire rien
je veut savoir pourqoui
voila c'est mon program je veux vous aidez
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
struct elm
{int val;
struct elm * suiv;
};
typedef struct elm *liste;
liste l,l1,l2,p;
/////////////////////////////////////////////////creation/////////////////////////////////////////////////////////////////
void creation(liste * l)
{int x,n,i;
printf("entrez le nombre d'elm de votre liste\n");
scanf("%d",&n);
for (i=1;i<=n;i++)
{printf("entrez la valeur de elm %d\n",i);
scanf("%d",&x);
p=new(elm);
p->val=x;
p->suiv=*l;
*l=p;
}
}
///////////////////////////////affichege///////////////////////////////
void affichage (liste l)
{liste p;
p=l;
while(p!=NULL)
{printf("%d\n",p->val);
p=p->suiv;
}
}
void eclater(liste l,liste *l1,liste *l2)
{
liste p;
while(l!=NULL)
{if(l->val %2== 0)
{
p=new(elm);
p->val=l->val;
p->suiv=*l1;
*l1=p;
}else
{p=new(elm);
p->val=l->val;
p->suiv=*l2;
*l2=p;
}
}l=l->suiv;
}
main()
{
creation(&l);
eclater(l,&l1,&l2);
affichage(l1);
affichage(l2);
}
1 réponse
-
'lut, "mon pc il devenu tres lent et je peux pas faire rien", normal, tu as une allocation mémoire qui s'exécute en boucle quelque part (j'ai testé, le graphique RAM monte en flèche; heureusement Linux roxxe du poney et l'OOM Killer s'est chargé de le tuer a ma place :-° )
Au fait, l'indentation, ça te dit quelque chose? Décalage du code selon les niveaux d'accolades... tu verras c'est très pratique.
p->suiv=*l;
, non!p->suiv
est du typestruct elm *
, et tu lui attribues le contenu la structure pointée parl
?!*l=p;
, non de non;l
est un pointeur d'elm
, et tu le déréférences pour l'attribution à p qui est aussi un pointeur; je sais pas comment l'expliquer facilement, mais ça revient à fairel[0] = p;
, orl
n'est pas un tableau, ni même alloué lors de la première itération de demande de valeur (potentiel crash donc, vu que cette variable n'est pas initialisée).
En fait ces deux lignes font les choses a l'envers; il faut que p contienne la structure que tu as créé avecnew
(ce qui est le cas), que tu attribuesp->val
(c'est fait), que tu laissesp->suiv
vide (NULL) ou non initialisé (car on a pas encore créé l'élément suivant), attribuesp
(qui est un pointeur) àl->suiv
(car l est l'élément précédent), puis enfin attribues le pointeurp
au pointeurl
.
Sachant que dans tout ça il faut que premierelm
alloué soit 1. conservé (c'est le début de la chaine), 2. pas attribué àl->suiv
carl
n'est pas encore attribué.
Et idem pour ta fonctioneclater
, qui est celle qui cause problème au niveau de la mémoire...