Ciao a tutti, avrei un po di difficoltà nella comprensione delle
liste. Posto qui un pezzo di programma, affinchè qualcuno mi possa
gentilmente commentare riga per riga le due funzioni list_add e
list_remove sperando cosi di capirci qualcosa di più...Vi ringrazio
fin da adesso...

/* STRUTTURA GLOBALE */


typedef struct ns {
int data;
struct ns *next;


} node;


.........

/* FRAMMENTO DI FUNZIONE MAIN */


int main(void) {
node *n = NULL;


list_add(&n, 0); /* lista: 0 */
list_add(&n, 1); /* lista: 1 0 */
list_add(&n, 2); /* lista: 2 1 0 */
list_add(&n, 3); /* lista: 3 2 1 0 */
list_add(&n, 4); /* lista: 4 3 2 1 0 */
list_print(n);
list_remove(&n); /* rimuove il primo elemento (4) */
list_remove(&n->next); /* rimuove il nuovo secondo (2) */
list_remove(list_search(&n, 1)); /* rimuove la cella che contiene
1 (primo) */
list_remove(&n->next); /* rimuove il successivo (0) */
list_remove(&n); /* rimuove l'ultimo (3) */


.......


/* AGGIUNGO UN ELEMENTO ALLA LISTA */


node *list_add(node **p, int i) {
node *n = malloc(sizeof(node)); /* alloco memoria */
n->next = *p;
*p = n;
n->data = i;
return n;



}


/* RIMUOVO ELEMENTO */

void list_remove(node **p) { /* rimuove head */
if (*p != NULL) {
node *n = *p;
*p = (*p)->next;
free(n);
}