arbre.c 2.75 KB
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#define TAILLE 27

typedef struct arbre{
    char val;
    struct arbre *suite[TAILLE];
    bool finmot; //1 si fin de mot
}Arbre;

typedef struct dico {
    Arbre *alpha[TAILLE];
}Dico;



int calculcase(char c){
    if(c==39){
        return 26;
    }
    else if(c<97){
        return c-'A';
    }
    else {
    return c-'a';
    }
}

bool est_vide(struct arbre *arbre)
{
	return arbre==NULL;
}

bool fin_de_mot(struct arbre *arbre)
{
	return arbre->finmot;
}

void ini_dico(struct dico * pt_dico){
    printf("ini_dico\n");
    for(int i=0;i<TAILLE;i++){
        pt_dico->alpha[i]=NULL;        
    }
}
void creation_arbre(Arbre **ppt_arbre,char c){
    printf("creation arbre\n");
    Arbre *monarbre=malloc(sizeof(struct arbre));
    monarbre->val=c;
    monarbre->finmot=false;
    for(int j=0;j<TAILLE;j++){
        monarbre->suite[j]=NULL;     
    }
    *ppt_arbre=monarbre;
}
    

void ajout_mot(struct arbre **arbrecourant,char *mot,int i){

    printf("%s:length:%zu \n",mot,strlen(mot));
    
    if(mot[i]!='\0'){
        printf("\nlettre:%c; i=%d\n",mot[i],i);
        if (*arbrecourant==NULL){
            creation_arbre(arbrecourant,mot[i]);
        }
        i++;
        ajout_mot(&((*arbrecourant)->suite[calculcase(mot[i])]),mot,i);
    }

}

void charger_arbre(FILE *fp, struct dico **ppt_dico)
{   char mot[20];
    ini_dico(*ppt_dico);
    while (fscanf(fp, "%s", mot)==1){
        printf("mot:%s\n\n\n",mot);
        printf("\nlettre:%c\n",mot[0]);
        ajout_mot(&((*ppt_dico)->alpha[calculcase(mot[0])]),mot,0);
    }
    return ;
}


void free_arbre(struct arbre *pt_arbre){
   if (pt_arbre==NULL){
        return ;
    }
    for(int i=0;i<TAILLE;i++){
        free_arbre((pt_arbre->suite[i]));
    }
    free(pt_arbre);
}

void free_dico(struct dico *pt_dico){
   if (pt_dico==NULL){
        return ;
    }
  
    for(int i=0;i<TAILLE;i++){
        free_arbre((pt_dico->alpha[i]));
    }

    free(pt_dico);
}

void affiche_arbre(struct arbre *arbre){
    if(arbre==NULL){
        return ;
    }
    printf("%c:",arbre->val);
    for(int i=0;i<TAILLE;i++){
        affiche_arbre(arbre->suite[i]);
    }
}

void affiche_dico(struct dico *dico){
    if(dico==NULL){
        return ;
    }
    printf("---------------------------------------\n");
    for(int i=0;i<TAILLE;i++){
        printf("%d:",i);
        affiche_arbre(dico->alpha[i]);
        printf("\n");
    }
   
}


int main (){
    FILE* fp = fopen("words-no-accents","r"); //amelioration entrée
	if(fp == NULL){ return EXIT_FAILURE;} //File is not readable
	
    struct dico *mondico=malloc(sizeof(struct dico));
    charger_arbre(fp,&mondico);
    affiche_dico(mondico);
    
    
    free_dico(mondico);
    fclose(fp);    
    return 0;
}