Вставка в связный список


Я знаю, что это очень простой, но теперь я начинаю с группы после расстраивается из-за моих практик кодинга и знания стандартных идиом там и элегантный способ кодирования угловых случаев. Проблема в том, чтобы вставить в хвост списка.

void insertattail (struct node *head, int data)
{
  //First construct the node in newp
  struct node *newp;
  struct node *p;
  newp = malloc (sizeof (struct node));
  newp -> data = data;
  newp -> next = NULL; 

  // Standard name for node pointers only used for traversal? p? q? tmp?
  // if more than 1 kind of nodes?
  // Then what about temp pointers for swapping etc but not exactly for traversal?

  if (head == NULL)  // is there more elegant way of dealing with this? any idiom?
  {
    head = newp;
    return;
  }

  for (p=head; p->next != NULL; p++)
    ;
  p->next=newp;
}


467
6
задан 30 мая 2011 в 12:05 Источник Поделиться
Комментарии
1 ответ

if(head == NULL)  // is there more elegant way of dealing with this? any idiom?
{
head=newp;
return;
}

руководителем является локальной переменной в этой функции. Изменение не будет менять переменную, которая была передана в функцию. В результате новый узел создается не привязан к чему-либо, что абонент может получить доступ. Если вы хотите изменить переменную передается в вам нужно использовать указатель. Если вы хотите изменить указатель, вы должны использовать указатель на указатель.

Вот версия, которая сокращает объем кода, но для тех, кто не думаю, что в указки, естественно, это может быть трудно следовать.

// I take a pointer to a pointer so that I can modify it if need be.
void insertattail(struct node **head,int data)
{
// advance the pointer until it reaches NULL
// because its a pointer to a pointer I can modify it
while(*head != NULL) head = &(*head)->next;

// replace that NULL with a new node
*head = malloc(sizeof(struct node));
// fill up the node
(*head)->data = data;
(*head)->next = NULL;
}

7
ответ дан 30 мая 2011 в 03:05 Источник Поделиться