Il codice che usi per controlalre le occorrenze è poco corretto, dato che per quello che ho visto usi due cicli for per incrementare l'indice nell'elenco e visualizzare a video quante occorrenze ci siano di una parola, il problema è QUALE parola, con il tuo codice infatti il numero di occorrenze si riferirà sempre all'ultima stringa dell'elenco. A questo punto potresti calcolare le occorrenze di UNA stringa in questo modo:
//per le occorrenze
void calcolaOcc( Elenco e,int pos,int r){
int occ=-1;
for (int i=0;i<r;++i){
if (strcmp(e[i],e[pos])==0)
++occ;
}
cout<<"\nci sono "<<occ<<" nomi ripetuti \n";
}
Altrimenti dovresti strutturare il codice in modo tale da calcolarti tutte le possibili occorrenze esistenti
//ad esempio in tale lista:
// Paolo
// Valeria
// Anna
// Paolo
// Anna
ci sono 2 parole che hanno ripetizioni , Paolo ne ha 2 e Anna ne ha 2. In questo caso potresti usare come appoggio un array di interi che abbia la stessa dimensione della lista, il cui valore dell'iesimo elemento equivalga al numero di occorrenze presenti nell'elenco per quella stringa, un esempio:
void calcolaOcc( Elenco e,int r){
int occ[r]; //array di appoggio
int nOcc;
for (int i=0;i<r;++i){
nOcc=-1;
for(int j=0;j<r;++j){
if (strcmp(e[i],e[j])==0)
++nOcc;
}
occ[i]=nOcc;
}
// altro codice per visulaizzare i risultati
}
Altrimenti fai uso di puntatori.
Per il codice dell'ordinamento invece, il codice è sbagliato perché il secondo for parte sempre dall'inizio, quindi non fa quello che dovrebbe, prova invece così:
void ordinaNomi( Elenco e,int r){
bool ordine = true;
for(int i=0;i<r-1;++i){
if(strcmp(e[i],e[i+1])>0){
ordine=false;
break;
}
}
if(ordine==true)
cout<<"\n sono in ordine \n";
else
cout<<"\n non sono in ordine \n";
}