1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
typedef struct lettre lettre;
struct lettre
{
int code_ascii;
int frequence;
lettre * suivant;
};
/* Renvoie !=0 si la lettre existe dans la liste, 0 sinon. La position de la
structure correspondante dans la liste est stockée dans position */
int lettreExiste(lettre * listeLettres, const char ascii, int * position) {
int existe = 0;
int cpt = 0;
if (listeLettres) {
lettre * noeudParcours = listeLettres;
while (noeudParcours != NULL) {
if (noeudParcours->code_ascii == ascii) {
existe = 1;
if (position) {
*position = cpt;
}
break;
}
noeudParcours = noeudParcours->suivant;
++cpt;
}
}
return existe;
}
/* Ajoute une lettre dans la liste et renvoie la nouvelle lettre créée */
lettre * ajouter_lettre(lettre * listeLettres, const char ascii)
{
lettre * nouvelleLettre = NULL;
nouvelleLettre = malloc(sizeof(*nouvelleLettre));
if (nouvelleLettre) {
nouvelleLettre->suivant = NULL;
nouvelleLettre->code_ascii = ascii;
nouvelleLettre->frequence = 1;
listeLettres->suivant = nouvelleLettre;
}
return nouvelleLettre;
}
/* Retourne la lettre située à la position pos dans la liste */
lettre * lettreDeLaPosition(lettre * listeLettres, const int pos)
{
int cpt=0;
lettre * lettre = listeLettres;
while(cpt < pos) {
lettre = lettre->suivant;
++cpt;
}
return lettre;
}
int main(int argc, char ** argv) {
lettre lettreBidonDebutListe = { EOF, 0, NULL };
lettre * noeudListeLettre = NULL,
* noeudListeParcours = NULL,
* noeudAdetruire = NULL;
FILE * file = NULL;
int ch = EOF, position=-1;
if (argc != 2) {
fprintf(stderr,"Bad number of arguments.\n");
fprintf(stderr,"Usage: cptascii <file>\n");
exit(EXIT_FAILURE);
}
file = fopen(argv[1], "r");
if (!file) {
fprintf(stderr,"Error: cannot open file %s\n", argv[1]);
exit(EXIT_FAILURE);
}
/* traitement */
noeudListeLettre = &lettreBidonDebutListe;
while ((ch=fgetc(file)) != EOF) {
if (isalnum((unsigned)ch)) {
if (!lettreExiste(&lettreBidonDebutListe, ch, NULL)) {
noeudListeLettre = ajouter_lettre(noeudListeLettre, ch);
}
else if (lettreExiste(&lettreBidonDebutListe, ch, &position)) {
lettre * l = lettreDeLaPosition(&lettreBidonDebutListe, position);
l->frequence++;
}
}
}
/* affichage résultat */
for (noeudListeParcours=lettreBidonDebutListe.suivant;
noeudListeParcours != NULL ;
noeudListeParcours=noeudListeParcours->suivant )
{
printf("%c:\t%d\n", noeudListeParcours->code_ascii, noeudListeParcours->frequence);
}
/* libération mémoire */
while (lettreBidonDebutListe.suivant != NULL)
{
noeudAdetruire = lettreBidonDebutListe.suivant;
lettreBidonDebutListe.suivant = lettreBidonDebutListe.suivant->suivant;
free(noeudAdetruire);
}
fclose(file);
return 0;
} |
Partager