IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

probleme de suppression des element de la table de hachage


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut probleme de suppression des element de la table de hachage
    bonjour à tous,
    jai construit une table de hachage qui contient des mots et pour chaque mot sa frequence.
    jai fait une focntion qui supprime les element de la table de hachage qui supprime les mot qui ont ne frequence egale à 1.
    le probleme c'est que j'ai decouvert que meme apres cette operation de suppression ya encore de element qi persistent encore dans la table de hachage et qui ont une frequence ==1
    je vois pas pourquoi?
    help svp
    merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    void clean_table(Liste **TableHash, int NombreLigne )
    {
        int boucle;
        float suup=0;
     
        for ( boucle = 0; boucle < TAILLEHASH; boucle++)
        {
            Liste *premier_valide = NULL;
            Liste *q = TableHash[boucle];
            while (q != NULL)
            {
                printf ("%d", q->freq);
                //suup = (float)(q->freq) / (float)(NombreLigne);
     
               // printf("%f", suup);
                //
                //if (suup <= Seuil)
                if(q->freq==1)
                {
                    /* supprime l'element */
                    Liste *tmp = q->suivant;
                    /* -mo- libere(q); n'est pas déclarée */
                    q = tmp;
                }
                else
                {
                    if (premier_valide == NULL)
                    {
                        premier_valide = q;
                    }
                    q = q->suivant;
                }
            }
            TableHash[boucle] = premier_valide;
        }
    }
    le probleme c'est que quand je remplie cette table d'un ptit nombre de mots: cette fonction marche nikel
    et dans le cas contraire ca donne pas de bon resultats

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ton algorithme ne fait que supprimer le premier élément de chaque liste si il a un fréquence de 1. Tu travaille correctement pour les premiers éléments (tant que fréquence de 1, on supprime et on marque le suivant comme premier), mais tu dois aussi gérer correctement les cas ou tu n'est plus en tete de liste. Là tu dois récupérer l'élément précédent et changer son ->suivant (voir algorithmique, suppression d'éléments dans une liste chainée).

  3. #3
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    void clean_table(Liste **TableHash, int NombreLigne )
    {
        int boucle;
        float suup=0;
        Liste  *next;
     
        for ( boucle = 0; boucle < TAILLEHASH; boucle++)
        {
            Liste *premier_valide = NULL;
            Liste *q = TableHash[boucle];
            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)
                    {
                        TableHash[boucle]=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;
                }
            }
            TableHash[boucle] = premier_valide;
        }
    }

  4. #4
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut supprimer element liste chainee
    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 .
    j'ai fait ce code,
    bizarre a l'aide de dubugger je vois bien qu'il supprime bien les elemnt voulus, mais dans l'affichage des element restant de la liste, je vois qu'il ya un element diqparu , or normallement il n'est pas supprimé
    bizarre non???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Liste* filtrer_liste(Liste *seq, int a )
    {
     
        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)
                    {
                        seq=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;
                }
            }
            seq = premier_valide;
            return seq;
     
    }

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par cyrine Voir le message
    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 .
    j'ai fait ce code,
    bizarre a l'aide de dubugger je vois bien qu'il supprime bien les elemnt voulus, mais dans l'affichage des element restant de la liste, je vois qu'il ya un element diqparu , or normallement il n'est pas supprimé
    bizarre non???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Liste* filtrer_liste(Liste *seq, int a )
    {
     
        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)
                    {
                        seq=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;
                }
            }
            seq = premier_valide;
            return seq;
     
    }
    Non, regarde dans ton autre poste et déroule l'exemple à la main. Tu comprendras mieux pourquoi il te manque des éléments.

  6. #6
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    merci 3DArchi
    mais je vois bien qu'il supprime bien les mots avec le debugger

    peut etre j'ai tort?...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression des données de 2 tables
    Par Marcopololo dans le forum IHM
    Réponses: 2
    Dernier message: 23/07/2008, 00h41
  2. probleme d'affichage des elements d'une table
    Par lightzeus dans le forum SQL
    Réponses: 5
    Dernier message: 14/08/2007, 17h07
  3. probleme recuperer liste des elements
    Par am.adnane dans le forum Struts 1
    Réponses: 3
    Dernier message: 14/06/2007, 13h46
  4. probleme de numerotation des données dans une table
    Par tchimou dans le forum Bases de données
    Réponses: 8
    Dernier message: 17/04/2007, 14h26
  5. suppression des ligne ds une table
    Par roger.pouamoun dans le forum Oracle
    Réponses: 6
    Dernier message: 28/07/2006, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo