Блог пользователя red_coder

Автор red_coder, 12 лет назад, По-английски

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;
}
  • Проголосовать: нравится
  • -2
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

"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.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    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?

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      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

»
4 года назад, # |
  Проголосовать: нравится -6 Проголосовать: не нравится

Do we need a linked list in competition programming?