[C]supprimer element de la liste chainéé

stroumpf Messages postés 292 Statut Membre -  
stroumpf Messages postés 292 Statut Membre -
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. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Peux-tu nous donner un code minimal qui illustre ton problème et qui compile ?

    Bonne chance
    -1
  2. stroumpf Messages postés 292 Statut Membre 2
     
    merci mamiemando, mais le code est tres long.
    :(
    -1
  3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
    1. stroumpf Messages postés 292 Statut Membre 2
       
      merci Char Snipeur :)
      -1
    2. stroumpf Messages postés 292 Statut Membre 2
       
      merci , mais ca na pas marché
      -1
  4. stroumpf Messages postés 292 Statut Membre 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;
    }
    
    -1