[C]Problème fonction recherche élément liste
sportif_C
Messages postés
18
Date d'inscription
Statut
Membre
Dernière intervention
-
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); } } } } } } }
A voir également:
- [C]Problème fonction recherche élément liste
- Liste déroulante excel - Guide
- Fonction si et - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
1 réponse
Bonjour, dans le code vous avez mis :
"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 :
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; }