Using single versus double pointers in Linked lists implemented in C

c, double-pointer, linked-list, pointers

Solution

Because in the second example, `q` is a copy of the pointer passed in by the caller. The caller's original pointer never gets modified.

Problem

I was writing this code for adding element at the end of linked list: ``` struct node{ int info; struct node* link; }; void append ( struct node **q, int num ) { struct node *temp, *r ; if ( *q == NULL ) // if the list is empty, create first node { temp = (struct node*) malloc ( sizeof ( struct node ) ) ; temp -> info = num ; temp -> link = NULL ; *q = temp ; } else{ temp = *q ; /* go to last node */ while ( temp -> link != NULL ) temp = temp -> link ; /* add node at the end */ r = (struct node *)malloc ( sizeof ( struct node ) ) ; r -> info = num ; r -> link = NULL ; temp -> link = r ; } } ``` and I call append function like this: `append(&list, 10);` where `list` is the pointer to the linked list This code works, but if I use single pointer in append function(using *q instead of **q) and make changes accordingly (as done below and also when I call it), it doesn't work. What is wrong with the code below?: ``` void append ( struct node *q, int num ) { struct node *temp, *r ; if ( q == NULL ) // if the list is empty, create first node { temp = (struct node*) malloc ( sizeof ( struct node ) ) ; temp -> info = num ; temp -> link = NULL ; q = temp ; } else{ temp = q ; /* go to last node */ while ( temp -> link != NULL ) temp = temp -> link ; /* add node at the end */ r = (struct node *)malloc ( sizeof ( struct node ) ) ; r -> info = num ; r -> link = NULL ; temp -> link = r ; } } ```

Original source