[C] insere mot table de hachage

stroumpf Messages postés 292 Statut Membre -  
beslae Messages postés 109 Date d'inscription   Statut Membre -
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;
}
Configuration: Windows Vista
Internet Explorer 7.0

5 réponses

  1. beslae Messages postés 109 Date d'inscription   Statut Membre 16
     
    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
    1. stroumpf Messages postés 292 Statut Membre 2
       
      donc comment faire, comment modifier, aucune idée moi ^^
      -1
  2. beslae Messages postés 109 Date d'inscription   Statut Membre 16
     
    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
    1. stroumpf Messages postés 292 Statut Membre 2
       
      merci beslae,
      mais le probleme est ici :if(strcmp(p->mot, mot)==0)
      p->freq++;
      il maffiche erreur de segmenttaion
      -1
  3. beslae Messages postés 109 Date d'inscription   Statut Membre 16
     
    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
    1. stroumpf Messages postés 292 Statut Membre 2
       
      ^^
      c'est la fonction de hachage
      -1
  4. beslae Messages postés 109 Date d'inscription   Statut Membre 16
     
    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
    1. stroumpf Messages postés 292 Statut Membre 2
       
      c'est la clé de hachage predefini
      regrde google tu vas avoir une idée^^
      -1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question