Allora, per prima cosa devi essere sicuro che la dimensinoe dell'array sia sufficiente per contenere i nuovi elementi. Ad esempio se la sua dimensione è 10 e contiene già 8 elementi, puoi aggiungerne al massimo altri due, altrimenti potresti accedere ad area di memoria che non è di tua competenza ('segmentation fault' ad esempio).
Per quanto riguarda l'inserimento, penso che sia meglio non mettere nei parametri l'array e la posizione dell'elemento da inserire, bensì solo il valore da inserire:
void inserisci(elenco_corsi v[],const elenco_corsi &e,int &n) {
in questo modo puoi usare la funzione per inserire qualsiasi elemento di tipo 'elenco_corsi' in un array dato dello stesso tipo, sia che esso provenga da un array che da una singola variabile (la funzione infatti deve inserire 'uno e un solo' elemento).
Penso che poi sia sufficiente solo la verifica:
if (e.studente <=v[i].studente)
dato che il posto da inserire è quello in cui il suo valore sia o ugale o minore.
A questo punto il codice modificato potrebbe essere questo:
void crea_spazio (elenco_corsi v[], int& n, int pos) {
for ( int i = n ; i > pos ; i-- )
v [ i ] = v [ i - 1 ] ;
n++;
}
void inserisci ( elenco_corsi v[] , const elenco_corsi &e , int &n ) {
int i = 0 ;
while ( i < n ) {
if ( e.studenti < v[i].studenti ) break ;
i++ ;
}
crea_spazio(v,n,i);
v[i] = e;
}
void inserisci_k (elenco_corsi v[] , int& n , elenco_corsi w[] , int k ) {
for(int j=0; j<k; j++)
inserisci (v, w[j], n ) ;
}