Io in questi casi mi faccio una funzione di appoggio...
Ad esempio:

codice:
int howManyChars (char* s, char t);
che restituisca il numero di occorrenze del carattere t nella stringa s, facendo in pseudocodice:

codice:
int count = 0;

while (*s != '\0')
{
        se *s == t, allora incremento count;
 
        s = s + 1;
}

return count;
A questo punto nella funzione frequenza fai tipo:

codice:
void frequenza (char a [], int n) /* n non serve a mio parere */
{
       int max = 0;
       char* s = a;
       char piuFrequente;

       while (*s != '\0')
       {
                  se "howManyChars" (a, *s)  > max, allora questo è il nuovo max 
                  e piuFrequente = *s;

                 s = s + 1;
       }

       qui fai la stampa che desideri visto che ti sei salvato il carattere più frequente e la sua frequenza!

}