Nel tuo esempio di codice, a me pare un inserimento in coda, di solito si restituisce il primo nodo della lista, ma se proprio vuoi restituire l'ultimo nodo creato, potresti mettere un if() che valuta !=NULL, restituisce il nodo creato, se ==NULL, restituisce la lista inviata come parametro.
Per eliminare un nodo della lista con free(), senza perdere il puntatore alla lista, dovrai crearti una funzione apposita, con puntatori temporanei che memorizzano "la lista", se elimini il primo nodo, la funzione restituirà il puntatore al secondo nodo, se elimini un nodo intermedio, la funzione, prima memorizza il puntatore al nodo da eliminare in variabile temporanea, poi collega il puntatore *next che precede il nodo da eliminare, al puntatore del nodo successivo, e infine richiami free() sul puntatore temporaneo che memorizza il nodo da eliminare.

Trovi esempi li liste online, dove sicuramente c'è un esempio di funzione "EliminaNodo()"