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