Prova a riflettere sulle differenze tra queste righe:
codice:
// tua 
void elimina (elem*testa,char* st)

// del prof
void elimina(elem *& testa, char*s)
e capirai tutto il codice.

Inoltre cerca di capire anche la differenza tra:
codice:
delete    p->info;    // tua
delete[]  p->info;    // del prof