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 :

recherche dans une table de hachage


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 6
    Par défaut recherche dans une table de hachage
    Bonsoir!
    je dois creer une table de hachage, y inserer les mots d'un texte, et pouvoir retrouver le nombre d'occurence d'un mot. Ce que je comprends, c'est que chaque mot aura une cle de hachage, et le meme mot sera inserer dans une liste au meme indice.
    voila mon code de hachage et ma fonction de recherche (retrieveHash) :

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    typedef struct L {
    	char *str;
    	struct L *next;
    	}list;
     
     
     
     
    char *readData( FILE *doc) {
    	char chaine[ARRAY_SIZE];
    	char *p = NULL;
                 if (doc != NULL && fgets(chaine,ARRAY_SIZE, doc)!= NULL) 
    	     {
    		p = strchr(chaine, ' ');
    		if(p!= NULL) *p = '\0';
    		p = malloc(strlen(chaine)+1);
    		if(p != NULL) strcpy(p, chaine);
    	     }
    		return p;
    	     }
     
        unsigned long hash(char *key) {
    	unsigned long h = 0;
    	int c;
    	  for(; *key; key++) 
    		h = h + *key;
    	return h % TABLE_SIZE;
    	}
     
    void insertHash(list **h_table, char *mot) {
    	h_table = (list **)malloc(TABLE_SIZE * sizeof(list*));
    	unsigned long val = hash(mot);
    	   list *my_list = h_table[val];
     
    		if(my_list != NULL) 
    		{
    		   strcpy(mot, my_list->str);
    		     my_list->next = h_table[val];
    		     h_table[val] = my_list;
    		}
     
    	}
     
     
    list *retrieveHash (list **my_table, char *word) {
    	list *a_list;
    	unsigned long key = hash(word);
    	for (a_list = my_table[key]; a_list != NULL; a_list = a_list->next) {
    		if(strcmp(word, a_list->str) == 0)
    		   return a_list;
    		}
    	  return NULL;
    	  }
     
     
     
     
    int main( int argc, char *argv[]) {
    	FILE *fichier = NULL;
    	list **table = NULL;
    	list *liste;
    	char *buff;
    	int i = 0;
    	   if (argc>1) 
    	    {
    	    fichier = fopen(argv[1], "r");
    	    }
    		do{
    	  	 buff= readData(fichier);
    		 if (buff != NULL) 
    		    insertHash(table, buff);
    		  } while (buff != NULL); 
     
    	liste = retrieveHash(table,"years");
    	  while(liste) {
    		if (liste == NULL)
    		    printf("occurence = 0");
    		else 
    		i++;
    		liste = liste->next;
    		}
    		printf("occurence = %d", i);
     
    	return 0;
    	}
    mon program affiche toujours, faute de segmentation..
    merci d'y jeter un coup d'oeil

  2. #2
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Bonjour,

    Dans votre fonction "readData()" vous commetez une erreur en faisant:

    if(p!= NULL) *p = '\0';
    Alors que vous n'avez pas réservez un octet de mémoire auparavant pour stocker votre caractère.
    Quand l'on déclare un pointeur de type char, on ne réserve pas de place mémoire pour stocker un char.
    Ainsi rajoutez

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    @ quetzacoatl :

    La ligne juste au-dessus est capitale pour comprendre la manoeuvre. Le pointeur "p" a la valeur retournée par "strchr". Le but est ici de remplacer le premier espace caractère trouvé (s'il y en a un) par le caractère de fin de chaine (valeur '\0').

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p = strchr(chaine, ' '); /* Cherche le 1er espace dans la chaine */
    if(p!= NULL) *p = '\0'; /* S'il est trouvé, on le remplace par '\0' */
    Il ne s'agit pas d'allouer de la mémoire ici, mais juste de remplacer un caractère de la chaine "chaine" par un autre.

    (J'ai pas regardé le reste, je n'ai pas regardé si le code fonctionnait )

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 6
    Par défaut
    oui c'est aussi ce que je me disais. Je remplace l'espace par le charactere EOF. Mais mon probleme vient surement de l'insertion dans la table de hachage non?
    Quelqu'un pour m'aider?

  5. #5
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    En compilant avec -g, avec un fichier de core générer par le système, et avec gdb tu devrais trouver d'où vient ton problème.

    Notamment, dans insertHash(), tu passe un pointeur en paramètre, mais il ne te sert pas et ce que tu en fais tu le perd. Regardes les parties sur les pointeurs dans les tutoriels/cours.
    Après, une bonne indentation permet d'avoir du code clair et lisible

Discussions similaires

  1. [SQL] recherche dans une table
    Par H-bil dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 06/06/2006, 11h26
  2. Recherche dans une table via un formulaire
    Par Z[ee]k dans le forum Access
    Réponses: 3
    Dernier message: 05/06/2006, 11h14
  3. [VB6] Erreur durant la recherche dans une table
    Par quaife dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/04/2006, 17h21
  4. Recherche dans une table
    Par Fredo67 dans le forum Access
    Réponses: 2
    Dernier message: 28/02/2006, 17h21
  5. recherche dans une table Access en ASP
    Par D-D dans le forum ASP
    Réponses: 3
    Dernier message: 09/06/2004, 10h12

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