Finalmente ci sono riuscito.
Volevo solo chiarire 2 dubbi, per farveli individuare ho preferito mettere dei punti "?".

1) perchè il programma mi funziona solo se passo la testa in questo modo:
codice:
lista insert( lista *&head, int elemento);
cioè, perchè passare *&

2) precisamente con:
codice:
head=temp;              // ?
questo cosa faccio? perchè?


Questo il codice:
Codice PHP:
#include<iostream>

using namespace std;

/* Tipo di dato lista */
typedef struct nodo{
    
int valore;
    
nodo *link;
lista;



/* Prototipi delle functions */
lista insertlista *&headint elemento);
void stampa(lista *head);



int main()
{

    
lista *head=NULL;

    
char choise;
    
int elemento;

    do {
        
cout << "Elemento da inserire: "<<endl;
        
cin>>elemento;
        
insert(headelemento);
        
cout<<"Continuare l'inserimento?(s/n)"<<endl;
        
cin>>choise;

    } while(
choise=='s' || choise=='S');


    
stampa(head);


    return 
0;
}


/* function per inserire in modo ordinato gli elementi nella lista */
lista insert(lista *&headint elemento) {

    
lista *temp, *prec, *current;

    
current=head;

    
/* se il nodo corrente, cioè nel primo caso la testa(NULL) => vedi [ current=head ] e' nullo
     * o l'elemento e' <= del valore del puntatore corrente => nel nostro caso sempre NULL, poichè non
     * esiste alcun nodo,
     * INSERISCO L'ELEMENTO IN TESTA ALLA LISTA
     */
    
if(current == NULL || elemento <= current->valore){

        
temp=new lista;         // alloco dinamicamente memoria per un nodo temporaneo(temp)
        
temp->valore=elemento;  // salvo l'elemento nel nodo temporaneo
        
temp->link=current;     // il nuovo nodo creato, punterà a current che equivale alla testa, quindi il valore viene messo dietro la testa
        
head=temp;              // ?

    
} else {

        
/* altrimenti se il nodo corrente non è nullo, cioè vale a dire esiste almeno un nodo
         * e l'elemento da inserire è maggiore di quelli precedenti,
         * fin quando il nodo corrente non punterà a NULL e l'elemento da inserire
         * è > di quelli già presenti nella lista,
         * salverò ad ogni iterazione il nodo subito precedente a quello che ha valore più grande dell'elemento da inserire.
         * es. |3|->|8|->|22|->NULL, se volessi inserire 5, savlerei il nodo con valore 3, in quanto alla itererazione successiva,
         * avremo un nodo che ha valore > dell'elemento da inserire(uscendo così dal while).
         */
        
while(current != NULL && elemento current->valore){

            
prec=current;           // salvo il nodo precedente
            
current=current->link;  // scorro la lista

        
}

        
temp=new lista;         // alloco dinamicamente memoria per un nodo temporaneo(temp)
        
temp->valore=elemento;  // salvo l'elemento nel nodo temporaneo
        
temp->link=current;     // il nodo che viene inserito, punterà a quello successivo, nel nostro esempio al nodo ->|8|
        
prec->link=temp;        // il nodo precedente, nel nostro caso |3|-> punterà al nuovo nodo inserito, nel nostro esempio |5|
    
}
}


/* function per stampare gli elementi della lista */
void stampa(lista *head) {

    
lista *tmp;
    
tmp=head;

    
cout<<"Lista stampata:"<<endl;

    while (
tmp != NULL) {
        
cout<<tmp->valore<<endl;
        
tmp=tmp->link;
    }