[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   -
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);



                           }

                       }
                    }
               }
          }
     }
}

1 réponse

  1. Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
     
    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