Puoi fare qlcosa del genere:
codice:
//Struttura per mantenere il numero di occorrenze di una stringa
struct ListCount
{
char *el;
struct ListCount *next;
int count;
};
//La seguente funzione prende in input una lista di List e
//restituisce una lista di ListCount, costiutita da tanti elementi
//quanti sono le stringhe diverse, e per ognuna il campo count
//contiene il numero di occorrenze della stringa
struct ListCount *buildListCount(struct List lis){
//Il puntatore a ListCount che sarà resituito come risultato
struct ListCount * lisCount= NULL;
//scorriamo la lista di stringhe
for(;lis != NULL; lis = lis -> next){
//se listCount non è ancora inizializzato creiamo il
//primo elemento e ci inseriamo la prima stringa
//della lista
if(lisCount == NULL){
lisCount =(struct ListCount *)malloc(sizeof(struct ListCount));
lisCount -> el = lis -> el;
lisCount -> next = NULL;
lisCount -> count = 1;
}
//altrimenti scorriamo lisCount; se la stringa
//corrente è gia presente incrementiamo il campo
//count, se no aggiungiamo un nuovo elemento
//alla lista lisCount per la stringa corrente
else{
ListCount *temp = lisCount;
//ultimo elemento non nullo di lisCount
ListCount *last = NULL;
for(; temp != NULL; temp = temp -> next){
if(strcmp(lis -> el, temp -> el) == 0){
temp -> count = temp -> count + 1;
break;
}
last = temp;
}
//Se la stringa non è stata trovata temp == NULL
//quindi creiamo un nuovo elemento nella lista
if(temp == NULL){
last -> next = (struct ListCount *)malloc(sizeof(struct ListCount));
last = last -> next;
last -> el = lis -> el;
last -> next = NULL;
last -> count = 1;
}
}
}
return lisCount;
}
A questo punto, se vuoi stampare le stringhe in ordine decrescente di occorrenze puoi ordinare la lista restituita da buidListCount in base al campo el, e poi stamparla.
PS: il codice non l'ho testato, quindi potrebbe contenere errori, però come idea è corretto,