[C]Problème fonction recherche élément liste

Fermé
sportif_C Messages postés 18 Date d'inscription samedi 22 août 2009 Statut Membre Dernière intervention 16 janvier 2012 - 16 janv. 2012 à 14:43
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 16 janv. 2012 à 20:34
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!
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:

1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 16/01/2012 à 20:42
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; 
  } 
0