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
|
short calculer_frequences(FILE *source, unsigned long *nb_octet, unsigned short *nb_ascii)
{
int i, x;
unsigned char buffer[BUF];
short index_freq=0, index_preview=-1;
int continuer=1;
short x1, x2;
*nb_octet=0;
*nb_ascii=0;
memset(tree_d, 0, 512*sizeof(struct tree_data));
/*Lecture dans le fichier */
while ((x=fread(buffer, 1, BUF, source))>0)
{
*nb_octet+=x;
for(i=0; i<x; i++)
/* incrémentation du compteur du caractère correspondant */
tree_d[buffer[i]].frequence++;
}
/* Chainage des structures avec une fréquence supérieure à 0 */
for(i=0; i<256; i++)
if (tree_d[i].frequence>0)
{
(*nb_ascii)++;
if (index_preview==-1)
index_freq=i;
else
tree_d[index_preview].index_next=i;
index_preview=i;
}
if (index_preview==-1)
index_freq=-1;
else
tree_d[index_preview].index_next=-1;
/* Tri des structures (le trie a bulle) */
while (continuer)
{
x1=index_freq;
continuer=0;
index_preview=-1;
while(x1!=-1)
{
if ((x2=tree_d[x1].index_next)!=-1)
{
if (tree_d[x1].frequence>tree_d[x2].frequence)
{
continuer=1;
if (index_preview==-1)
index_freq=x2;
else
tree_d[index_preview].index_next=x2;
tree_d[x1].index_next=tree_d[x2].index_next;
tree_d[x2].index_next=x1;
}
index_preview=x1;
x1=x2;
}
else
x1=x2;
}
}
/* On retourne l'index de la première structure */
return index_freq;
} |