Dunque, l'errore di segmentation fault è dovuto all'istruzione:
Codice PHP:
if (== NULL) {
        
p->next paus;
    } 
se p è NULL non puoi accedere al campo next!


La versione che ti ha dato GNAWS non è corretta, se passi ad una funzione un puntatore p che è NULL, e all'interno della funzione inizializzi p con la malloc, all'uscita della funzione p è sempre NULL perchè in C gli argomenti sono passati per VALORE. Per fare quello che vuoi devi fermarti nelle chiamate ricorsive prima di arrivare all'elemento NULL. Quindi devi considerare 3 casi:

1 - p == NULL: avviene all'inizio quando la lista e vuota: crei un nuovo oggetto hello con la malloc e lo ritorni;

2 - p -> next == NULL: crei un nuovo oggetto hello con la malloc inizializzando p -> next con tale elemento;

p -> next != NULL: richimi ricorsivamente la funzione. Un modo di scrivere la funzionè è allora:

Codice PHP:
hello *aggiungi(hello *pint ins)
{
    if (
== NULL) {
        
= (hello *) malloc(sizeof(hello));
        
-> ins;
        
-> next NULL;
    }
    else if(
-> next == NULL){
        
-> next = (hello *) malloc(sizeof(hello));
        
-> next -> ins;
        
-> next -> next NULL;
        
-> next;
    }
    else{
        
aggiungi(-> nextins);
    }

    return 
p;

la funzione ritorna sempre l'ulitmo elemento inserito nella lista. Se lista è la variabile puntatore a hello che mantiene la lista, allora dovra essere inizilizzata col valore di ritorno della prima chiamata a aggiungi:

hello *lista = NULL;
lista = aggiungi(lista, 5);

mentre le volte successive non devi asssegnare a lista il risultato di aggiungi se no lista non punterà piu alla testa della lista.