tree.c 3.85 KB
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 30
#define NB_CARAC 26
#define nb_car 5

typedef struct node* Node;

typedef struct node {
  char letter;
  Node next[NB_CARAC];
  bool endWord;
}node;

bool is_empty_tree(Node Tree)
{
  return(Tree==NULL);
}

bool is_leaf(Node Tree)
{
  for(int i=0; i<NB_CARAC; i++)
    if(Tree->next[i] != NULL)
      return false;
  return true;
}

void init_tree(Node* Tree)
{
  if(is_empty_tree(*Tree))
    {
      *Tree = malloc(sizeof(node));
      (*Tree)->letter = '?';
      (* Tree)->endWord = false;
      for(int i=0; i<NB_CARAC; i++)
	(*Tree)->next[i] = NULL;
    }
}

void add_in_tree(Node Tree, char word[])
{
  int j=0;
  Node Tree2 = Tree;
  while(word[j] != '\0')
    {
      if(is_leaf(Tree2))
        printf("empty\t");
      char letter = word[j];
      if(Tree2->next[letter-'a']!=NULL)
	{
	  Tree2 = Tree2->next[letter-'a'];
	  printf("%c %d\t", letter, letter-'a');
	  printf("okA %d\n", j);
	}
      else
	{
	  Node new = NULL;
	  new = malloc(sizeof(node));
	  new->letter = letter;
	  for(int i=0; i<26; i++)
	    {
	      new->next[i]=NULL;
	    }
	  Tree2->next[letter-'a'] = new;
	  Tree2->endWord = false;
	  Tree2=Tree2->next[letter-'a'];
	  printf("%c %d\t", letter, letter-'a');
	  printf("okB %d\n", j);
	}
      j++;
      if(word[j]=='\0')
	Tree2->endWord = true;
    }
  printf("ok\n");
}

bool is_end_caract(char letter)
{
  int endCaract[nb_car] = {0, 44, 45, 46, 47}; // a remplir
  for(int i=0; i<nb_car; i++)
  {
    if(letter==endCaract[i])
      return true;
  }
  return false;
}

char max_index(char word[])
{
  int index = 0;
  while(!is_end_caract(word[index]))
    index++;
  return index;
}

void scan_word(Node Tree, char word[], int* error) // ne gère pas les mots avec endWord = true
{
  int ind = 0;
  char letter;
  Node Tree2 = Tree;
  while(!is_end_caract(word[ind]))
  {
    letter = word[ind];
    if(Tree2->next[letter-'a']!=NULL)
    {
      ind++;
      Tree2 = Tree2->next[letter-'a'];
    }
    else
    {
      printf("mot : %s erreur :%c %d \n", word, word[ind], word[ind]);
      (*error)++;
      ind = max_index(word);
    }
  }
}

void read_txt(FILE* fp, Node* Tree, int* error)
{
  char word[MAX];
  while(1)
  {
    if(fscanf(fp, "%s", word)!=1)
      return;
    scan_word(*Tree, word, error);
  }
}

void read_lib(FILE* fp, Node* Tree)
{
  char word[MAX];
  while(1)
    {
      if(fscanf(fp, "%s", word)!=1)
	return;
      printf("--%s--\n", word);
      //fflush(stdout);
      add_in_tree(*Tree, word);
    }
}

void print_tree(Node Tree, int index)
{
  if(is_empty_tree(Tree))
    return;
  Node cpTree = NULL;
  cpTree = Tree;
  if(cpTree->next[index]==NULL && index<26)
    {
      print_tree(cpTree, index+1);
    }
  else if(index == 26)
    {
      return;
    }
  else
    {
      printf("%c\n", (cpTree->next[index])->letter);
      if((cpTree->next[index])->endWord)
	{
	  printf("fin\n");
	  //print_tree(cpTree, 0);
	  return;
	}
      print_tree(cpTree->next[index], 0);
    }
}

int find_index(Node tree)
{
  Node cpTree = tree;
  int index = 0;
  while(cpTree->next[index]==NULL && index < NB_CARAC)
    index++;
  return index;
}

void print_first(Node Tree)
{
  Node cpTree = Tree;
  int index = 0;
  while(!is_leaf(cpTree))
    {
      index = find_index(cpTree);
      printf("%c\n", (cpTree->next[index])->letter);
      cpTree=cpTree->next[index];
    }
}

int main(int argc, char *argv[])
{
  Node tree = NULL;
  int error = 0;
  FILE* fp_lib;
  FILE* fp_txt;
  fp_lib = fopen(argv[argc-2], "r");
  fp_txt = fopen(argv[argc-1], "r");

  init_tree(&tree);
  read_lib(fp_lib, &tree);
  read_txt(fp_txt, &tree, &error);

  printf("%p\n", tree);

  print_first(tree);
  printf("\n");
  print_tree(tree, 0);
  
  printf("erreurs : %d\n", error);

  int endCaract[nb_car] = {0, 44, 45, 46, 47}; // a remplir
  for(int i=0; i<nb_car; i++)
  {
    printf("%c", endCaract[i]);
  }
  return 0;
}