[C]Problème fonction recherche élément liste
sportif_C
Messages postés
23
Statut
Membre
-
Hxyp Messages postés 401 Date d'inscription Statut Membre Dernière intervention -
Hxyp Messages postés 401 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je recherche à créer une fonction qui permet d'abord d'ajouter 0 au début de la pil. Puis de vérifier si un élément existe ou pas dans la pile. S'il n'existe pas et que l'élément est plus petit on l'ajout à la pile sinon on reboucle. On s'arrete si tout les éléments sont parcourus.
voici mes structures et ma fonction. Cependant, ça ne fonctionne pas correctement. L'algorithme s'arrete à la première itération
Quelqu'un pourrait m'aider à le corriger?
Merci!
Je recherche à créer une fonction qui permet d'abord d'ajouter 0 au début de la pil. Puis de vérifier si un élément existe ou pas dans la pile. S'il n'existe pas et que l'élément est plus petit on l'ajout à la pile sinon on reboucle. On s'arrete si tout les éléments sont parcourus.
voici mes structures et ma fonction. Cependant, ça ne fonctionne pas correctement. L'algorithme s'arrete à la première itération
Quelqu'un pourrait m'aider à le corriger?
Merci!
typedef struct elementCustomer
{
int no;
struct elementCustomer *suivant;
}customer;
typedef struct liste{
customer *debut;
int taille;
} Pile;
int chercherNoeud(double **distanceEntreVertices, Pile *tas)
{
int i, j;
int trouve;
double distanceMin =10000.000;
customer *nouveauCustomer;
if ((nouveauCustomer = (customer*) malloc (sizeof (customer))) == NULL)
{
printf("erreur reservation memoire pour la structure de type customer!");
return -1;
}
if(tas->debut = NULL)
{
printf("la pile est vide!");
return 1;
}
else
{
if(tas->debut != NULL)
nouveauCustomer->no = 0;
for(i=1; i<nbreNoeuds; i++)
{
trouve =0;
{
if( i == nouveauCustomer->no)
{
trouve = 1;
nouveauCustomer->suivant = tas->debut;
tas->debut = nouveauCustomer;
tas->taille++;
}
else
{
trouve = 0;
while(trouve == 0 && tas !=NULL)
{
// }
if (distanceEntreVertices[0][i] < distanceMin)
{
distanceMin = distanceEntreVertices[0][i];
nouveauCustomer ->no = i;
printf("%d",i);
}
}
}
}
}
}
}
1 réponse
-
Bonjour, dans le code vous avez mis :
trouve = 0; while(trouve == 0 && tas !=NULL) {
"trouve" sera toujours à zéro avant la boucle, ne sais pas si le problème vient de là.
A part ça, je pense que vous utilisez une liste chaîné avec l'ajout par le début ? et que le premier élément à zéro sera au final le dernier ? Si tel est le cas pouvez faire simplement une fonction "foreach"/"callback" qui prend la pile et appel une fonction passée en paramètre et lui renvoi le pointeur actuel qu'il scrute dans la boucle, l'idée :#include <stdio.h> #include <stdlib.h> typedef struct elementCustomer { int no; struct elementCustomer *suivant; }customer; typedef struct liste{ customer *debut; int taille; } Pile; Pile *init_pile(void){ Pile *pptr; pptr=malloc(sizeof(Pile)); if(pptr){ pptr->debut=NULL; pptr->taille=0; } else pptr=NULL; return pptr; } customer *ret_customer(int n){ customer *ptr; ptr = malloc(sizeof(customer)); if(ptr) ptr->no=n; else ptr=NULL; return ptr; } int add_customer(Pile *pptr, int n){ customer *cptr; cptr=ret_customer(n); if(cptr){ cptr->suivant=pptr->debut; pptr->debut=cptr; pptr->taille+=1; return 0; } return 1; } void foreach(Pile *pptr,int (*f)(customer *)){ /* la fonction qui utilse notre fonction et renvoi le customer * en parametre de celle-ci */ customer *cp=pptr->debut,*cptmp; while(cp!=NULL){ cptmp=cp; cp=cp->suivant; if(f(cptmp)) printf("f true\n"); else printf("f false\n"); } } int cb(customer *c){ /* fonction appelé par foreach il lui passe le customer en param */ printf("%d\n",c->no); if(c->no>10) return 1; return 0; } int freelist(customer *c){ if(c)free(c); return 0; } int main(void) { int t[4]={1,5,39,3},i; Pile *p=init_pile(); for(i=0;i<4;i++) add_customer(p,t[i]); printf("list:\n"); foreach(p,cb); printf("free list:\n"); foreach(p,freelist); free(p); return 0; }