Dunque, l'errore di segmentation fault è dovuto all'istruzione:
Codice PHP:
if (p == 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 *p, int ins)
{
if (p == NULL) {
p = (hello *) malloc(sizeof(hello));
p -> n = ins;
p -> next = NULL;
}
else if(p -> next == NULL){
p -> next = (hello *) malloc(sizeof(hello));
p -> next -> n = ins;
p -> next -> next = NULL;
p = p -> next;
}
else{
p = aggiungi(p -> next, ins);
}
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.