#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>

#define LONGUEUR_MAX_MOT 30    // Longueur maximale d'un mot
#define TAILLE_HASH      37987 // Un nombre premier pour la taille de la table
#define BASE             128   // La base pour le calcul de hachage

typedef struct _element {
    char mot[LONGUEUR_MAX_MOT]; // Le mot stocké dans l'élément
    struct _element *suivant;   // Pointeur vers l'élément suivant
} Element;

typedef struct _tableHash {
    unsigned int taille;              // Taille de la table de hachage
    unsigned int nbEntreesOccupees;   // Nombre d'entrées occupées dans la table
    unsigned int nbElements;          // Nombre total d'éléments stockés
    Element **elements;               // Tableau de pointeurs vers les éléments
} TableHash;


struct Mail
{

char mot[50];
struct Mail* suivant;

};


// Prototypes des fonctions


void initialiserTableHash(TableHash *tableHash);
void insererElementDansTableHash(TableHash *tableHash, char *mot);
void chargerDictionnaireDepuisFichier(TableHash *tableHash, const char *nomFichierDictionnaire);
unsigned long obtenirValeurHash(char *chaine);
bool verifierExistenceMotSpam(TableHash *tableHash, char *mot);

struct Mail* ajoutermot( struct Mail* liste,  char mot[50]) ;
struct Mail* lireDonneesDuFichier(char* nomFichier);
void afficherListe(struct Mail* liste);



// Fonctions

// Fonction qui initialise la table de hashage 

void initialiserTableHash(TableHash *tableHash) 

{
    tableHash->taille = TAILLE_HASH; // Définit la taille de la table de hachage avec une valeur prédéfinie.
    
    tableHash->nbEntreesOccupees = 0; // Initialise le nombre d'entrées occupées dans la table à 0.
    
    tableHash->nbElements = 0; // Initialise le compteur total d'éléments stockés dans la table à 0.
    
    tableHash->elements = (Element **) malloc(tableHash->taille * sizeof(Element*)); // Alloue dynamiquement la mémoire pour le tableau d'éléments basé sur la taille de la table.

    for (unsigned int i = 0; i < tableHash->taille; i++) // Boucle sur chaque entrée du tableau d'éléments.
        tableHash->elements[i] = NULL; // Initialise chaque entrée du tableau à NULL, indiquant qu'aucun élément n'est encore stocké à cet index.
}



// Fonction qui insere un element dans la table de hachage 


void insererElementDansTableHash(TableHash *tableHash, char *mot)

{
    
    tableHash->nbElements++; // Incrémente le nombre total d'éléments dans la table de hachage.
    
    unsigned long index = obtenirValeurHash(mot); // Calcule l'index de la table où le mot sera inséré, basé sur sa valeur de hachage.
    Element *nouvelElement = (Element *) malloc(sizeof(Element)); // Alloue de la mémoire pour un nouvel élément.

    strcpy(nouvelElement->mot, mot); // Copie le mot dans le nouvel élément.

    if (tableHash->elements[index] == NULL) // Vérifie si l'emplacement à l'index calculé est vide (aucun élément inséré précédemment).
        
        tableHash->nbEntreesOccupees++; // Si c'est le cas, incrémente le nombre d'entrées occupées dans la table de hachage.

    nouvelElement->suivant = tableHash->elements[index]; // Fait pointer le nouvel élément vers le premier élément actuel de la liste à cet index.
    tableHash->elements[index] = nouvelElement; // Fait devenir le nouvel élément le premier élément de la liste à cet index.
}


// Fonction qui charge le dictionnaire depuis un fichier dans une table de hachage 

void chargerDictionnaireDepuisFichier(TableHash *tableHash, const char *nomFichierDictionnaire) 

{
    FILE *fichier = fopen(nomFichierDictionnaire, "r"); // Tente d'ouvrir le fichier du dictionnaire en mode lecture.

    if (fichier != NULL) // Vérifie si le fichier a été ouvert avec succès.
    { 
        char mot[LONGUEUR_MAX_MOT]; // Crée un tableau pour stocker temporairement chaque mot lu.

        while (fscanf(fichier, "%s", mot) == 1) // Lit les mots du fichier un par un.

            
            insererElementDansTableHash(tableHash, mot); // Insère chaque mot lu dans la table de hachage.
        
    } 
    
    else printf("Fichier non trouvé."); // Affiche un message d'erreur si le fichier n'a pas pu être ouvert.
    
    fclose(fichier); // Ferme le fichier après avoir fini de lire ou en cas d'erreur.
}


// Fonction qui verifie si mot dans dictionnaire 




bool verifierExistenceMotDansDictionnaire(TableHash *tableHash, char *mot)
{
    unsigned long valeurHash = obtenirValeurHash(mot); // Calcule la valeur de hachage du mot pour trouver son emplacement potentiel dans la table.

    Element *element = tableHash->elements[valeurHash]; // Récupère la liste d'éléments à cet emplacement de hachage.
    bool trouve = false; // Initialise le flag de recherche à faux.

    while (!trouve && element != NULL)// Parcourt la liste tant que le mot n'est pas trouvé et que la liste n'est pas terminée.
        
    { 
        trouve = (strcmp(mot, element->mot) == 0); // Compare le mot recherché avec le mot de l'élément courant.
        element = element->suivant; // Passe à l'élément suivant dans la liste.
    }

    return trouve; // Retourne vrai si le mot a été trouvé, faux sinon.
}



unsigned long obtenirValeurHash(char *chaine)
{
    unsigned long valeurHash = 0; // Démarre avec une valeur de hachage initiale de 0 pour accumuler le résultat.
    
    int i = 0; // Utilise i pour suivre la position du caractère dans la chaîne, influençant son poids dans le calcul de hachage.
    
    while ((*chaine) != '\0')// Continue de traiter chaque caractère jusqu'à atteindre la fin de la chaîne ('\0').
        
    { 
        // Pour chaque caractère, ajoute à la valeur de hachage actuelle, pondérée par sa position (i) et la valeur ASCII du caractère.
        valeurHash = (valeurHash + (*chaine) * (unsigned long) pow(BASE, i)) % TAILLE_HASH; 
        
        i++; // Passe à la position suivante pour le prochain caractère.
        
        chaine++; // Avance dans la chaîne pour traiter le prochain caractère.
    }
    return valeurHash % TAILLE_HASH; // Assure que la valeur de hachage retournée est dans les limites valides de la table de hachage.
}



struct Mail * ajoutermot( struct Mail*liste,  char mot[50])

{
    struct Mail* nouveaumot = (struct Mail*)malloc(sizeof( struct Mail));
   
    if (nouveaumot != NULL)
     {
        strcpy(nouveaumot->mot, mot);
       
      
       
        nouveaumot->suivant = liste;
         
        return nouveaumot;
    }
   
    return NULL;
}




struct Mail* lireDonneesDuFichier(char* nomFichier)

 {
    struct Mail* listemot = NULL; // permet de stocker le début de la liste chaîne élève . L'initialisation NULL indique que la liste est vide au départ.
   
    FILE* fichier = fopen(nomFichier, "r"); //résulat stocké avec un pointeur de type FILE* nomé fichier et ouvre le fichier.

    if (fichier == NULL) // Si fichier == NULL, l'ouverture a échoué
   
    {
        printf("Le fichier %s n'a pas été trouvé.\n", nomFichier);
       
        return NULL;
    }

    char mot[50]; // déclare 2 variables locales
   
    
    while (fscanf(fichier, "%s", mot) == 1) // ATTENTION QUAND ON A UN STRING , ON MET PAS L'"&" ALORS QUE QUAND ON A UN FLOAT OU UN INT OU LE RESTE, ON MET L'&.
        // Lit les valeurs à chaque itération. La boucle continue tant que fscan renvoie 2 ce qui signifie que els 2 valeurs ont été lues avec succès
   
    {
        listemot = ajoutermot(listemot, mot); // La liste chainée nommée liste elvèves ets implémntée avec la note et le nom  qui viennent d'être lues sur le fichier
    }

    fclose(fichier);
   
    return listemot; // Renvoie le pointeur vers le début de la liste chaînée remplie avec les données lues du fichier texte et de les stocker dans une structure de données.
}



void afficherListe(struct Mail* liste)

{
    struct Mail* courant = liste; // Initialise le pointeur courant avec la valeur de liste. Au début courant pointe vers le premier élément de la liste
   
    while (courant != NULL) // tant que le pointeur courant n'est pas NULL
   
     {
        printf("Mot: %s ", courant->mot); 
         
        courant = courant->suivant; //On met à jour le pointeur courant pour qu'il pointe vers le prochain élève de la liste chaînée. Cela se fait en assignant à 'courant' la valeur du pointeur suivant de
                                   // l'élément courant
                                   
                                                                     
    }

}

    // Fonction qui verifie si mot dans dictionnaire 




bool verifierExistenceMotSpam(TableHash *tableHash, char *mot)
    
{
    unsigned long valeurHash = obtenirValeurHash(mot); // Calcule la valeur de hachage du mot pour trouver son emplacement potentiel dans la table.

    Element *element = tableHash->elements[valeurHash]; // Récupère la liste d'éléments à cet emplacement de hachage.
    bool trouve = false; // Initialise le flag de recherche à faux.

    while (!trouve && element != NULL)// Parcourt la liste tant que le mot n'est pas trouvé et que la liste n'est pas terminée.
        
    { 
        trouve = (strcmp(mot, element->mot) == 0); // Compare le mot recherché avec le mot de l'élément courant.
        element = element->suivant; // Passe à l'élément suivant dans la liste.
    }

    return trouve; // Retourne vrai si le mot a été trouvé, faux sinon.
}

int main()
{



    return 0;
    
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: