[C]supprimer element de la liste chainéé

Bonjour,
bonsoir à tous,
j'ai fait une fonction qui supprime les element de la liste chaine qui ont une frequence<1
quand je l'ai testé tous les element sont supprimés seul l'elemnt entete qui n'est pas supprime
je vois pas pourquoi
voila le code
void filtrer_liste(Liste *seq)
{


    Liste  *next;


        Liste *premier_valide = NULL;
        Liste *q =seq;
        while (q != NULL)
        {
           // printf ("%d", q->freq);
            //suup = (float)(q->freq) / (float)(NombreLigne);

           // printf("%f", suup);
            //
            //if (suup <= Seuil)
            if(q->freq<=1)
            {
                if(premier_valide==NULL)
                {
                    premier_valide=q->suivant;


                }
                else
                premier_valide->suivant=q->suivant;
                // nettoyage
                next = q->suivant;
                free(q);  // libère la mémoire de 'p'
                q = next;




            }
            else
            {
                if (premier_valide == NULL)
                {
                    premier_valide = q;
                }
                q = q->suivant;
            }
        }
       // q = premier_valide;
    }

cordialement
Configuration: Windows Vista
Internet Explorer 7.0

4 réponses

  1. Modérateur
    Peux-tu nous donner un code minimal qui illustre ton problème et qui compile ?

    Bonne chance
    1. Contributeur
      tente ça :
      void filtrer_liste(Liste *seq)
      {
          Liste  *next;
              Liste *dernier_valide = NULL;
              Liste *q =seq;
              while (q != NULL)
              {
                  if(q->freq<=1)
                  {
                      // nettoyage
                      next = q->suivant;
                      free(q);  // libère la mémoire de 'p'
                      q = next;
      
                  }
                  else
                  {
                      if (dernier_valide == NULL)
                      {
                          dernier_valide = q;
                          seq=q; // seq pointe maintenant sur la première structure qui a une fréquence valide
                      }
                      else
                      {
                           dernier_valide->suivant=q;
                           dernier_valide=q;
                      }
                      q = q->suivant;
                  }
              }
          
          }
      1. merci Char Snipeur :)
      2. merci , mais ca na pas marché
    2. peut etre ca marche comme ca:
      Liste * filtrer_liste(Liste *seq)
      {
        Liste  *head=NULL,*previous=NULL,*current=NULL,*next=NULL;
        for(current=seq; current!=NULL; current=next) {
          next = current->suivant;
          if (current->freq<=1)  {
            free(current);
            if (previous!=NULL) previous->suivant = next;
          } else {
            previous = current;
            if (head==NULL) head=current;
          }
        }
      
        return head;
      }