Итак, я пытаюсь использовать цепочку хеш-таблиц для подсчета количества повторений всех слов в файле .txt. Вот что я сделал, вот мой заголовочный файл :
#ifndef _header5_
#define _header5_
typedef struct cellule {
char cle[15]; // Cle=Word
int valeur; // Number of occurences of the word
struct cellule *suivant;
} Cellule;
typedef Cellule * Liste; // type Liste
typedef struct table_hachage {
int taille; // table length
Liste *linkcase; // table of listes
} Table_hachage;
// type TableHacage
typedef Table_hachage *TableHachage;
/***************Methods*****/
int max(int,int);
int count_words (FILE*);
void read_words(FILE*);
TableHachage cree_table_hachage(int);
int hachage(TableHachage, char*);
int insere(TableHachage,char*);
int recherche(TableHachage, char*);
int Get_Value(TableHachage, char*);
void fill(TableHachage,FILE*);
#endif
и это моя реализация файла заголовка :
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "fnv.h"
#include "header5.h"
int max(int a,int b){
if(a>b)
return a;
else if(a<b)
return b;
else
return a;
}
int count_words (FILE *f) {
char word[1024];
int count=0;
/* assumes no word exceeds length of 1023 */
while (fscanf(f, " %1023s", word) == 1) {
count++;
}
return count;
}
void read_words(FILE *f) {
char word[1024];
/* assumes no word exceeds length of 1023 */
while (fscanf(f, " %1023s", word) == 1) {
puts(word);
}
}
//Create Empty chaining hashtable
TableHachage cree_table_hachage(int taille) {
int i;
TableHachage table = (TableHachage)malloc(sizeof(Table_hachage));
table->taille = taille;
table->linkcase = (Liste*)malloc(table->taille * sizeof(Liste));
for (i = 0; i < table->taille; i++)
table->linkcase[i] = NULL;
printf("HashTable is created\n");
return table;
}
//Getting the hash code using FNV1 Algorithm
//it works just fine by the way.
int hachage(TableHachage table, char *cle) {
//FNV HashCode Algorithm version 32-bits
int codeh = fnv_32_str(cle, FNV1_32_INIT);
return (abs(codeh) % table->taille);
}
//Insert the word in the hashtable
int insere(TableHachage table, char* cle) {
int codeh;
Liste liste = NULL;
codeh = hachage(table, cle); //getting the HashCode
liste = table->linkcase[codeh]; //getting the LinkedList at index==HashCode
while (liste) {
//In case the key is already existed we increment its value
//wich indicates the number of repetition of that word
if (strcmp(liste->cle, cle) == 0){
liste->valeur++;
return 0;
}
liste = liste->suivant;
}
//if it's the first time to encounter the word
//we insert it and give it's value 1
if (liste == NULL) {
liste = (Liste)malloc(sizeof(Cellule));
strcpy(liste->cle, cle);
liste->valeur=1;
liste->suivant = table->linkcase[codeh];
table->linkcase[codeh] = liste;
return 1;
}
}
//Search existence of a word
int recherche(TableHachage table, char *cle){
Liste liste = table->linkcase[hachage(table, cle)];
for (; liste; liste = liste->suivant)
if (strcmp(cle, liste->cle) == 0)
return 1;
return 0;
}
//Getting value of a key a.k.a number of repetition of a word
int Get_Value(TableHachage table, char *cle){
Liste liste = table->linkcase[hachage(table, cle)];
for (; liste; liste = liste->suivant)
if (strcmp(cle, liste->cle) == 0)
return liste->valeur;
}
//Fill my hashcode with words and number of repetition of that key in the file
void fill(TableHachage table,FILE* f){
char word[1024];
/* assumes no word exceeds length of 1023 */
while (fscanf(f, " %1023s", word) == 1) {
insere(table,word);
}
}
Так что моя проблема заключается в функции fill (), она почти такая же, как read_word () функция, которая работает просто отлично, за исключением того, что вместо печати слова, я хочу, чтобы оно было вставлено в хеш-таблицу.
когда я проверил, какая часть не работает в функции fill (), я понял, что она никогда не идетво время цикла.поэтому, когда я ищу слово, оно не может быть найдено.
Так кто-нибудь может мне это объяснить?с любыми предложениями, пожалуйста !!
РЕДАКТИРОВАТЬ: Вот мой основной ():
#include <stdio.h>
#include <stdlib.h>
#include "fnv.h"
#include "header5.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
FILE *file=fopen("fich.txt", "r");
int n=count_words(file);
//Creating an empty chaining hash table
TableHachage T=cree_table_hachage(n);
//fill hash table with words and its number of repetition in the text file
fill(T,file);
//student is a word in my file
if(recherche(T,"student")==1){
printf("found\n");
}
else{
printf("couldn't be found\n");
}
int occ=Get_Value(T, "student");
printf("Occ is: %d\n",occ);
fclose(file);
return 0
}