Относится к указателям в C - PullRequest
2 голосов
/ 05 мая 2020
void pushathead(struct Node* head, int data){
  struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
  new_node->data = data;
  new_node->next = head;
  head = new_node;
}
void pushathead(struct Node** head, int data){
  struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
  new_node->data = data;
  new_node->next = (*head);
  (*head) = new_node;
}

Может ли кто-нибудь объяснить разницу между двумя методами и какой из них следует использовать для реализации?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Первая реализация принимает аргумент указателя на заголовок вашего связанного списка.

Вторая реализация принимает указатель на указатель на заголовок вашего связанного списка.

Можете ли вы сказать почему это может быть важно?

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

Другими словами, первая реализация просто изменяет локальная копия head, последняя строка head = new_node; бессмысленна, фактически ничего не делает, потому что работает с локальным значением. Вторая реализация изменит указатель снаружи.

Первый будет вызываться так:

Node *head = NULL; // declared somewhere
pushathead( head, 1 );

А второй будет вызываться так:

Node *head = NULL;
pushathead( &head, 1 );

Использование оператора address-of здесь является большим намеком на то, что head будет изменен, и это то, что вы хотите.

0 голосов
/ 05 мая 2020

Я бы go для третьего варианта:

struct Node* pushathead(struct Node* head, int data){
  struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
  new_node->data = data;
  new_node->next = head;
  return new_node;
}

и использовал бы его так:

Node *list = NULL; // declared somewhere
list = pushathead( list, 10 );
list = pushathead( list, 20 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...