[C]supprimer element de la liste chainéé

Fermé
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 2 oct. 2008 à 23:08
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 3 oct. 2008 à 18:11
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
A voir également:

4 réponses

mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 811
3 oct. 2008 à 01:52
Peux-tu nous donner un code minimal qui illustre ton problème et qui compile ?

Bonne chance
-1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
3 oct. 2008 à 10:49
merci mamiemando, mais le code est tres long.
:(
-1
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
3 oct. 2008 à 13:16
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
3 oct. 2008 à 16:18
merci Char Snipeur :)
-1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
3 oct. 2008 à 17:24
merci , mais ca na pas marché
-1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
3 oct. 2008 à 18:11
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