Il codice è abbastanza commentato, quindi si dovrebbe capire facilmnte. PS: ho fatto qlcke prova e mi pare funzioni, ma non posso esserne sicuro al 100%, se sei interessato fai qlke prova tu ed eventualmente fammi sapere se trovi errori ;)

codice:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>


//Mantiene le frequenze delle lettere
int freqLettere['z' - 'a'];
//Mantiene le frequenze dei numeri
int freqNumeri[10];
//Mantiene il numero totale di caratteri trovati nel testo
//(lettere e numeri)
int totaleCaratteri = 0;
//Mantiene il numero totale di parole trovate nel testo
int totaleParole = 0;


//Definizione dell'elemento di una lista
typedef struct lista{
	char *parola;
	int frequenza;
	lista *next;
} lista;

//Variabile che mantiene le lista di parole
lista *parole = NULL;

//Inizializza a zero i vettori delle frequenze
void inizializza(){
	int i;
	for(i = 0; i < 10; i++)
		freqNumeri[i] = 0;
	for(i = 0; i < ('z' - 'a'); i++)
		freqLettere[i] = 0;
}

//Aggiorna le frequenze di lettere e numeri
void aggiornaFrequenze(char *parola){
	int i;
	char c;
	int len = strlen(parola);
	for(i =  0; i < len; i++){
		c = parola[i];
		//Se è una lettera
		if(isalpha(c)){
			//rendiamo tutte le lettere minuscole
			c = tolower(c);
			//incrementiamo la posizione corrispondente di freqLettere
			freqLettere[c - 'a']++;
		}
		//Se è un numero
		if(isdigit(c)){
			//incrementiamo la posizione corrispondente di freqLettere
			freqNumeri[c - '0']++;
		}
	}
	//Incremento il numero di parole totali
	totaleParole++;
	//Incremento il numero di caratteri totali
	totaleCaratteri = totaleCaratteri + len;
}

//Restituisce la prossima parola che si trova in testo a partire
//dalla posizione posizioneCorrente. Una parola è definita come
//una sequenza di lettere e/o numeri senza altri caratteri.
//Restituisce NULL se non c'è una prossima parola
char *prossimaParola(char *testo){
	static int posizioneCorrente = 0;
	int i;
	int len = strlen(testo);
	//mi sposto avanti finche non trovo una lettera o un numero
	while(! isalnum(testo[posizioneCorrente])){
		posizioneCorrente++;
		//se iuno alla fine senza aver trovato lettere o numeri
		//ritorno null
		if(posizioneCorrente >= len)
			return NULL;
	}
	//incremento i finchè trovo numeri e lettere; alla fine del cilco
	//i punta alla fine della parola corrente
	i = posizioneCorrente;
	while(isalnum(testo[i]) && (i < len))
		i++;
	int lunghezza = i - posizioneCorrente;
	char *parola = (char *)malloc((lunghezza + 1));
	for(i = 0; i <= lunghezza; i++)
		parola[i] = testo[posizioneCorrente + i];
	//Inserisco il carattere di fine stringa alla fine della parola
	parola[lunghezza] = '\0';
	posizioneCorrente = posizioneCorrente + i;
	return parola;
}

void stampaNumeri(){
	printf("\n\n");
	int i;
	for(i = 0; i < 10; i++)
		printf("\nfrequenza di %d: %d", i, freqNumeri[i]);
}

void stampaLettere(){
	printf("\n\n");
	int i;
	for(i = 0; i < ('z' - 'a'); i++)
		printf("\nfrequenza di %c: %d", 'a' + i, freqLettere[i]);
}

void stampaParole(){
	printf("\n\n");
	lista *temp = parole;
	while(temp){
		printf("\nfrequenza di %s: %d", temp -> parola, temp -> frequenza);
		temp = temp -> next;
	}
}

//Inserisce la parola nella lista parole, se non è gia presente,
//altrimenti incrementa la sua frequenza
void inserisciParola(char *parola){
	lista *temp = parole;
	//Scorriamo la lista per vedere se la parola è ia stata inserita
	while(temp){
		//Se la parola già c'è ci limitiamo a incrementare
		//la frequenza
		if(strcmp(temp -> parola, parola) == 0){
			temp -> frequenza++;
			return;
		}
		temp = temp -> next;
	}
	//Se la parola non è stata trovata, creiamo un nuovo elemento
	//che sarà inserito in testa alla lista.
	temp = (lista *)malloc(sizeof(lista));
	temp -> parola = parola;
	temp -> frequenza = 1;
	temp -> next = parole;
	//Facciamo puntare la lista 'parole' all'elemento di testa
	//appena isnerito
	parole = temp;
}


int main(){
	char * p;
	char *testo = "ciao\tt\n1r&7 (re)re t";
	while((p = prossimaParola(testo))){
		aggiornaFrequenze(p);
		inserisciParola(p);
	}
	stampaNumeri();
	stampaLettere();
	stampaParole();
	
	printf("\n\nTotale parole: %d", totaleParole);
	printf("\n\nTotale caratteri: %d", totaleCaratteri);
	return 0;
}