below is the function for adding some number to the end of the linked list.......
int add_at_end(struct node **q,int num)
{
struct node *temp;
if(*q==NULL)
{
temp= malloc(sizeof(struct node));
temp->data=num;
temp->link=NULL;
*q=temp;
}
else
{
temp=*q;
while(temp->link!=NULL)
{
temp=temp->link;
}
r=malloc(sizeof(struct node));
r->data=num;
r->link=NULL;
temp->link=r;
}
return 0;
}
now my question is what is the need of using double pointer for 'q' , why cant we do the same task using single pointer as below....
int add_at_end(struct node *q,int num)
{
struct node *temp;
if(q==NULL)
{
temp= malloc(sizeof(struct node));
temp->data=num;
temp->link=NULL;
q=temp;
}
else
{
temp=q;
while(temp->link!=NULL)
{
temp=temp->link;
}
r=malloc(sizeof(struct node));
r->data=num;
r->link=NULL;
temp->link=r;
}
return 0;
}
"q=temp" modifies just local variable(defined as parameter of this function), and remains argument unchanged. So actual list will not be changed if q == NULL.
While "*q=temp" allow to modify argument itself.
But as for me it is a good practice always provide non NULL value to such kind of functions.
i totally agree with your point but one question, suppose we already know that list is not empty , now if we use single pointer can it work? if yes, then please explain why?
Yes it can.
When we call a function we provide it a pointer to a struct node (suppose it's name is p). And this pointer is copied to variable q. So now q and p both point to the same structure. So we can modify this structure using both p and q (for example p->data=1; equal to q->data=1). So we can modify it from inside of our function. But if we try to assign different value to q directly, not to some field of structure (q = temp; in your code), original pointer p, which we were going to modify, calling this function will not be affected.
It works like next code: node *p = new node(1, 2); node *q = p; q = new node(3, 4);
I believe it is clear, that in this case p will not be affected. If it is not — try to debug through it.
But if you use a pointer to a pointer as in original code, instead of value of p (which is actually address of node) you have pointer to p, so you can modify it through this pointer
Do we need a linked list in competition programming?