correcteur.c 2.56 KB
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#define MAX_LETTRES 30
#define size 26


typedef struct node {
  char l;
  struct node * lettres[size];
  bool fin_de_mot;
} Node;






bool is_empty(struct node *tree)
{
	return tree==NULL;
}






bool is_leaf(struct node *tree)
{
    int cpt=1;
    if (is_empty(tree)) return 1;
    for (int i=0; i<size ; i++){
        if ( tree->lettres[i] == NULL){
            cpt++;
        }
    }
    if (cpt == size) cpt=1;
    if (cpt != size) cpt=0;
    return cpt ;
}






void ajout(Node **N, char lettre)
{
    Node *nouveau = malloc(sizeof(Node));
    (*nouveau).l=lettre;
    (*nouveau).fin_de_mot=0;
    for (int i=0; i<size; i++) nouveau->lettres[i]=NULL;
    *N = nouveau;
}






void ajout_alphab(Node ** pn, char *  mot,int cpt)
{
    Node * tmp= *pn;
    //printf("%d \n",cpt);
    char lettre=mot[cpt];
    int pos = lettre - 'a';
    //printf("%c \n",lettre);
    cpt++;
    if (lettre == '\0'){
        (*tmp).fin_de_mot=1;
        return;
    }
    if (tmp->lettres[pos] == NULL) {
        //printf("Rentré \n");
        ajout(&tmp->lettres[pos],lettre);
    }
    return ajout_alphab(&tmp->lettres[pos],mot,cpt);
    
    
}






Node * charger_arbre(Node ** Arbre){
    FILE * dico;
    char mot[MAX_LETTRES];
    dico = fopen("text.txt","r");
    int i;
    while ((i = fscanf(dico,"%s",mot)) == 1){
        ajout_alphab(Arbre,mot,0);
    }
    fclose(dico);
    return *Arbre;
}






void affichage_arbre(Node * Arbre)
{
    if (Arbre->l == '?' && is_leaf(Arbre)){
        printf("arbre vide \n");
        return;
    }
    for (int i=0; i<size; i++){
        if (Arbre->lettres[i] != NULL){
            printf("%c -> %c \n",Arbre->l,Arbre->lettres[i]->l);
            affichage_arbre(Arbre->lettres[i]);
        }
    }
    if (Arbre->fin_de_mot) printf("fin de mot \n");
}






void detruire_arbre(Node ** Arbre)
{
    printf("---------- \n");
    printf("%p \n",*Arbre);
    if (is_empty(*Arbre)) return;
    printf("%c \n",(*Arbre)->l);
    for (int i=0; i<size; i++){
        detruire_arbre(&(*Arbre)->lettres[i]);
    }
    free(*Arbre);
    printf("suppression \n");
    printf("%p \n",*Arbre);
}






void initialisation(Node ** Arbre){
    Node *nouveau = malloc(sizeof(struct node));
    (*nouveau).l='?';
    for (int i=0; i<size; i++) nouveau->lettres[i] = NULL;
    *Arbre = nouveau;
}





int main(){
    Node * Arbre;
    initialisation(&Arbre);
    charger_arbre(&Arbre);
    affichage_arbre(Arbre);
    printf("Arbre fini \n");
    detruire_arbre(&Arbre);
    affichage_arbre(Arbre);
    return 0;
}