[ C } table de hachage

Fermé
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 28 juil. 2008 à 01:12
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 - 6 août 2008 à 10:30
Bonsoir à tous,
J'ai un probleme dans ma table de hachage
Liste **TableHash;
  TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *));
  for(i=0;i<TAILLEHASH;++i)
    TableHash[i] = NULL;


En fait ma table de hachage contient des mots et à chaque mot il a sa liste de coordonnee.(num-ligne, position)
par exemple : bonjour(1,1), (2,1),(2,5)
le probleme là c'est que jaime faire une fonction qui calcula la frequence du mot à partir de la liste des coordonné par exemple là freq(bonjour) =2 car elle apparait dans la ligne 1 et igne 2.
typedef struct c{
	int pos;
	int nl;
	struct c *suivant;
}Coordonnees;

typedef struct L{
	char  mot[50];
	Coordonnees *c;
	struct L *suivant;
}Liste1;

4 réponses

mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
28 juil. 2008 à 20:53
Question, tu es toujours restreinte au C? Parce qu'en C++ ça se code en 2 lignes :s
Sinon il faut parcourir ta liste et compter le nombre de maillon mais c'est pas super.
Ou encore faire une structure liste dans ce genre :
struct cellule_t{
  struct cellule_t *suivant;
  char mot[50];
};

struct liste_t{
  struct cellule_t *premier;  
  struct cellule_t *dernier;  
  unsigned longueur;
};

Au moment de créer ta liste et d'insérer supprimer des cellules, tu mets à jour les pointeur (début/fin et les suivants des cellules adjacentes) et le compteur longueur. Du coup plus besoin de parcourir la liste pour avoir le nombre de maillon.

Bonne chance
-1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
28 juil. 2008 à 21:04
regarde ça :
supp=0;
int currentLine=-1;
for(c=p->c;c!=NULL;c=c->suivant)
{
 if (c.Line != currentLine)
 {
        currentLine = c.Line;
        supp++;
 }
}
-1
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
28 juil. 2008 à 21:10
Je repose ma question, tu es toujours restreinte au C ou tu peux programmer en C++ ?
Est-ce que la fréquence c'est le nombre d'occurrence du mot ou le nombre de lignes ou le mot apparaît ?
Ton code n'étant pas complet il m'est impossible d'être sûre de ce que tu fais.

Bonne chance
-1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
28 juil. 2008 à 21:16
OUI, c'est imposé là le C :(
Conernant ma fonction elle compte la frequence de chaque mot d'apres sa liste de coordonné en comptant le nombre de ligne distinct de la liste des coordonnées.
elle prend en entree le mot et cherche dans la table de hachage le mot, et compte ses different num ligne .
-1
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
29 juil. 2008 à 10:27
Si par mot, ta liste est ordonnée d'abord sur les lignes et ensuite sur les colonnes c'est facile. Ca consiste juste à parcourir la liste et à incrémenter le compteur quand le numéro de ligne change. Ca ressemble à ce que tu as fait. Tu as réussi ?
-1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
29 juil. 2008 à 10:30
Bonjour,
non, j'essaye jusquà maintenant.
merci
-1
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
29 juil. 2008 à 10:43
regarde ça, normallement il fonctionne :
int calculFrequence(Liste **TableHash, char mot[50]){

  Liste *p ;
  int cle;
  Coordonnees *c;
  int i,supp=0;
  cle=hash_cle(mot);
  for(p=TableHash[cle]; p!=NULL; p=p->suivant)
    {
    if(strcmp(p->m->mot, mot)==0){
    c=p->c;      
    
      for(c=p->c;c!=NULL;c=c->suivant)
	     supp++;
      }
}
return supp;
}

mais il maffiche une erreur: " [Linker error] undefined reference to `calculFrequence(char*, L2**)' "

Là vraiement je copmrends rien :(
-1
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
6 août 2008 à 10:30
Une erreur de linkage signifie que le code utilise une fonction déclarée mais que son implémentation n'a pas été trouvée. Ca survient principalement dans deux cas de figure :
1- la fonction est déclarée mais pas implémentée
2- le fichier c est compilé sans le binaire contenant ladite implémentation (typiquement si ce code est dans un autre module). Si la fonction appartient a une librairie, il faut linker cette librairie avec le fichier c contenant le main (voir option -l et -L de gcc).

Vu le nom de la fonction tu es dans le premier cas de figure. Je pense que tu as dû coder ton programme en plusieurs fichiers (des .h et des .c constituant les modules, et un fichier .c contenant le main) et que lors de la compilation du main.c tu oublies de passer les modules (fichiers .o) en paramètre. Exemple :

1) Compiler le module plop (plop.h et plop.c a priori)
gcc -W -Wall -c plop.c

2) J'obtiens un plop.o (le binaire associé au module). Supposons que main.c utilise une fonction déclarée dans plop.h et implémentée dans plop.h. Je dois alors compiler main.c en passant plop.o en paramètre.
gcc -W -Wall -o mon_executable main.c plop.o

3) J'obtiens mon exécutable.

De la même façon un module M1 peut utiliser d'autre module M2 et auquel cas, il faut compiler M2 (pour obtenir M2.o), puis M1 (en passant M2.o en paramètre) etc. Tu vois immédiatement que pour qu'une compilation se passe bien, tu ne peux pas avoir un "cycle" d'inclusion de module, sinon ce n'est pas compilable.

À partir du moment où ton programme est décomposé en plusieurs modules et requiert plusieurs lignes de compilation, il est fortement recommandé de fournir un Makefile avec (cf wikipedia + google). En outre, il est possible de faire des Makefile générique qui construisent automatiquement les dépendances entre les différents modules.

Bonne chance
-1