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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| #include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define TAILLEHASH 30700
#define BUFFSIZE 64
#define FNAME "c:\\out.txt"
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;
}
void insere_table(Liste **TableHash, char mot[50]);
unsigned int hash_cle(const char mot[50]);
int main(void)
{
FILE *fdesc=fopen(FNAME,"r");
Liste **TableHash;
char res[BUFFSIZE];
if( fdesc )
{
char *buff;
char *prec;
char vide[256];
if( get_word(fdesc,prec,BUFFSIZE) )
{
while( get_word(fdesc, buff, BUFFSIZE) )
{
printf("%s %s\n",prec,buff);
//insere_table(TableHash, prec);
strncpy( prec,buff,BUFFSIZE);
}
}
fclose(fdesc);
}
return 0;
}
void insere_table(Liste **TableHash, char mot[50])
{
/* calcule le hash du mot */
unsigned int idx = hash_cle(mot);
/* recherche du mot */
Liste *p = TableHash[idx];
while(p != NULL)
{
if(strcmp(p->mot, mot) == 0)
{
/* le mot est trouve */
break;
}
p =p->suivant;
}
if(p == NULL)
{
/* le mot n'existe pas, insertion de celui ci */
p = (Liste *)malloc(sizeof(Liste));
if(p == NULL)
{
/* erreur d'allocation de memoire */
printf("Erreur d'allocation mémoire\n");
exit(0);
}
/* initialisation de la structure */
p->freq = 1;
strncpy(p->mot, mot, sizeof(p->mot));
/* mise a jour des liens, insertion en debut de liste */
p->suivant = TableHash[idx];
TableHash[idx] = p;
return;
}
/* le mot existe */
/* ajout des coordonnees */
}
unsigned int hash_cle(const char mot[500])
{
unsigned int val = 0;
for(; *mot != '\0'; ++mot)
{
val = *mot + 31 * val;
}
return val % TAILLEHASH;
} |
Partager