2
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;
}

谁能解释这两种方法之间的区别,应该使用哪一种来实现?

4

2 回答 2

1

第一个实现接受指向链表头部的指针参数。

第二个实现接受一个指向链表头部的指针。

你能说出为什么这可能很重要吗?

您想使用第二个,否则您将失去对正在创建的新节点的任何引用。

换句话说,第一个实现只是修改 的本地副本head,最后一行head = new_node;没有意义,实际上什么都不做,因为它正在处理本地值。第二种实现将修改外部的指针。

首先将像这样调用:

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

第二个将被称为:

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

在这里使用 address-of 运算符是一个很大的提示,head它将被修改,这就是你想要的。

于 2020-05-05T15:42:12.160 回答
0

我会选择第三种选择:

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 );
于 2020-05-05T15:52:19.990 回答