#include #include #include #include #define LONGMAX 25 typedef struct noeud { char *mot; int nb_occ; struct noeud *gauche; struct noeud *droit; } Noeud; typedef Noeud *Adr_noeud; void trier(FILE *,FILE *); Adr_noeud entree_vers_arbre(FILE *); void arbre_vers_sortie(Adr_noeud,FILE *); Adr_noeud inser_arbre(Adr_noeud,char *); int lire_mot(FILE *,char *); int main(int argc, char *argv[]) { char nom[LONGMAX]; FILE *lecture,*ecriture; if (argc > 2) { if (strcmp(argv[1], "clavier")) { lecture = fopen(argv[1], "r"); while (lecture == NULL) { printf("le fichier d'entrée indiqué n'existe pas\n" "indiquer un autre nom de fichier d'entrée\n"); scanf("%s", &nom); lecture = fopen(nom, "r"); } } else { lecture = stdin; printf("Entrez votre texte et terminez-le en indiquant EOF\n"); } if (strcmp(argv[2], "ecran")) ecriture = fopen(argv[2],"w"); else ecriture = stdout; trier(lecture, ecriture); if (strcmp(argv[1], "clavier")) fclose(lecture); if (strcmp(argv[2], "ecran")) fclose(ecriture); } else printf("vous devez donner deux arguments ," "le premier étant clavier\nsi vous voulez indiquer" " les données au clavier\net le second ecran" " si vous voulez récuperer les résultats a l'écran\n"); return 0; } void trier(FILE *fich1,FILE *fich2) { Adr_noeud racine = NULL; racine = entree_vers_arbre(fich1); fprintf(fich2, "\nVoici la liste des mots\n"); arbre_vers_sortie(racine,fich2); } Adr_noeud entree_vers_arbre(FILE *fichier) { char le_mot[LONGMAX]; Adr_noeud la_racine=NULL; while (lire_mot(fichier,le_mot)!=EOF) la_racine = inser_arbre(la_racine,le_mot); return la_racine; } int lire_mot(FILE *fichier, char *un_mot) { int c; int i; while ((isspace(c = getc(fichier)) || ispunct(c)) && (c!='_') && (c != EOF)); if (c == EOF) return EOF; else { for (i = 0; !(isspace(c) || ispunct(c) || c == EOF) || (c == '_'); i++) { un_mot[i] = c; c = getc(fichier); } un_mot[i] = '\0'; return un_mot[0]; } } Adr_noeud inser_arbre(Adr_noeud rac, char *un_mot) { int comp; if (rac == NULL) { rac = (Adr_noeud) malloc(sizeof(Noeud)); rac->mot = (char *) malloc(strlen(un_mot)+1); rac->nb_occ = 1; strcpy(rac->mot, un_mot); rac->gauche = rac->droit=NULL; } else if ((comp = strcmp(un_mot,rac->mot)) == 0) rac->nb_occ++; else if (comp < 0) rac->gauche=inser_arbre(rac->gauche,un_mot); else rac->droit = inser_arbre(rac->droit, un_mot); return rac; } void arbre_vers_sortie(Adr_noeud rac,FILE *fichier) { if (rac != NULL) { arbre_vers_sortie(rac->gauche, fichier); fprintf(fichier,"%s (%d fois)\n",rac->mot, rac->nb_occ); arbre_vers_sortie(rac->droit, fichier); } }