[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);
}
}
}
}
}
}
}
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 code ascii - Guide
- Liste déroulante en cascade - 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;
}