I am learning data structure, and here is a thing that I am unable to understand...
int end(struct node** p, int data){
    /*
    This is another layer of indirection. 
    Why is the second construct necessary? 
    Well, if I want to modify something allocated outside of my function scope,
    I need a pointer to its memory location. 
    */
    
    struct node* new = (struct node*)malloc(sizeof(struct node));
    struct node* last = *p;
    new->data = data;
    new->next = NULL;
    while(last->next !=NULL){
        last = last ->next ;
    }
    last->next = new;
}
- why we are using struct node **p?
- can we use struct node *p in place of struct node **p? the comment which I wrote here is the answer I found here, but still, I am unclear about this here is the full code...
please help me thank you
 
     
     
    