Rechercher : dans
Par :

[C]supprimer element de la liste chainéé

Dernière réponse le 3 oct 2008 à 18:11:14 stroumpf, le 2 oct 2008 à 23:08:56 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [C]supprimer element de la liste chainéé » dans :
Liste simplement chaînée VoirLISTES SIMPLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes chaînées A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion...
Suppression impossible : liste d'arguments trop longue VoirSuppression impossible : liste d'arguments trop longue Finalité Je souhaite supprimer des fichiers (par exemple tous les fichiers d'extension .toto) dans un répertoire mais la commande "rm *.toto" me renvoie :bash: /bin/rm: Argument list too...
Liste doublement chaînée VoirLISTES DOUBLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes doublement chaînées A. Initialisation B. Insertion d'un élément dans la liste 1....
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

mamiemando, le 3 oct 2008 à 01:52:29

Peux-tu nous donner un code minimal qui illustre ton problème et qui compile ?

Bonne chance

Répondre à mamiemando

2

stroumpf, le 3 oct 2008 à 10:49:19

Merci mamiemando, mais le code est tres long.
:(

Répondre à stroumpf

3

Char Snipeur, le 3 oct 2008 à 13:16:26

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;
            }
        }
    
    }
Salutation !  avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

4

stroumpf, le 3 oct 2008 à 16:18:59

Merci Char Snipeur :)

Répondre à stroumpf

5

stroumpf, le 3 oct 2008 à 17:24:50

Merci , mais ca na pas marché

Répondre à stroumpf

6

 stroumpf, le 3 oct 2008 à 18:11:14

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;
}

Répondre à stroumpf