[C] insere mot table de hachage

Fermé
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 22 sept. 2008 à 07:26
beslae Messages postés 109 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 11 octobre 2008 - 22 sept. 2008 à 08:02
Bonjour,
j'ai un probleme au niveau de la fonction : void insere_th(Liste **TableHash, const char *mot)
qui insere un mot dans une table de hachage : elle verifi si le mot qu'on veut inserer est deja dans la table on incremente donc la frequence du mot .
il l'affiche une erreur de segmentation.
aidez moi svp
merci
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

#define BUFFSIZE 64
#define FNAME "d:\\test.txt"
#define TAILLEHASH 307

typedef struct L
{
	int freq;
	char mot[50];

	struct L *suivant;
} Liste;




char* get_word(FILE *fdesc, char *buff, size_t size)
{
	char *ret=NULL;

	if( fdesc!=NULL && buff!=NULL && size>0 )
	{
		int c;
		int i=0;
		while( ret==NULL && i<size && (c=fgetc(fdesc))!=EOF )
		{
			if( isalpha(c) )
			{
				buff[i]=c;
				i++;
			}
			else if( i>0 )
			{	/* mot */
				buff[i]='\0';
				ret=buff;
			}
		}
	}
	return ret;
}
unsigned int hash_cle(const char * mot)
{
	unsigned int val = 0;
	for(; *mot != '\0'; ++mot)
	{
		val = *mot + 31 * val;
	}
	return val % TAILLEHASH;
}

void insere_th(Liste **TableHash, const char *mot)
{
    TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *));

    	/* calcule le hash du mot */
	unsigned int idx = hash_cle(mot);

	/* recherche du mot */
	Liste *p = TableHash[idx];
	if(strcmp(p->mot, mot)==0)
        p->freq++;
	
	free(TableHash);

}







int main(void)
{
	FILE *fdesc=fopen(FNAME,"r");
	Liste **TableHash;

	if( fdesc )
	{
		char buff[BUFFSIZE];
		char prec[BUFFSIZE];


		if( get_word(fdesc,prec,BUFFSIZE) )
		{
			while( get_word(fdesc, buff, BUFFSIZE) )
			{
				//printf("%s %s\n",prec,buff);
				char s3[BUFFSIZE * 2];
                sprintf(s3, "%s %s", prec, buff);
                puts(s3);
				strncpy( prec,buff,BUFFSIZE);
				insere_th(TableHash,s3);
			}
		}
		fclose(fdesc);
	}

	return 0;
}
A voir également:

5 réponses

beslae Messages postés 109 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 11 octobre 2008 16
22 sept. 2008 à 07:44
Bah normal, t essaye de modifier le membre freq de la structure Liste pointé par p or p pointe vers un truc inconnue encore (tableau de quelque chose a l index idx qui connais pas :P )
1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
22 sept. 2008 à 07:45
donc comment faire, comment modifier, aucune idée moi ^^
-1
beslae Messages postés 109 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 11 octobre 2008 16
22 sept. 2008 à 07:30
Je sais pas mais moi j aurais mi un petit for( ) pour parcourir les index idx en plus je le vois null par d autre en variable globale ton idx !!

quelqu un avait dit :

declarer les variable, initialiser les variables, et apres travailler ladessus
-1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
22 sept. 2008 à 07:33
merci beslae,
mais le probleme est ici :if(strcmp(p->mot, mot)==0)
p->freq++;
il maffiche erreur de segmenttaion
-1
beslae Messages postés 109 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 11 octobre 2008 16
22 sept. 2008 à 07:50
Bah faut deja que tu sache ce que tu veux faire avec ton idx, pourquoi il est la ? il sert a quoi ?? parceque moi non plus je comprend pas ce que tu veux faire o fait val+=31 + *mot ??

juste une petite question c est quoi le 31 ??
-1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
22 sept. 2008 à 07:51
^^
c'est la fonction de hachage
-1
beslae Messages postés 109 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 11 octobre 2008 16
22 sept. 2008 à 07:57
Plus concretement tu peux m'expliquer ce que tu veux faire ...
voila t as une liste chainée, A->B->C .... sur chaque feuille il y a un mot une fréquence et le suivant, tu insert des feuilles et tous normal, c est quoi le 307, le 31, j veux dire ca vient d ou ??
-1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
22 sept. 2008 à 07:59
c'est la clé de hachage predefini
regrde google tu vas avoir une idée^^
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
beslae Messages postés 109 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 11 octobre 2008 16
22 sept. 2008 à 08:02
j ai lu vite fais ca, mais je vois toujours pas trop ce que tu veux faire !!

https://fr.wikipedia.org/wiki/Table_de_hachage
-1