C -单链表-通过值与引用传递指针


typedef struct node { int data; struct node *next; } NODE;
NODE* add_head(NODE **phead, int data) {
  NODE *new = (NODE *)malloc(sizeof(NODE));
  new->data = data;
  new->next = *phead;
  *phead = new;
  return new;
}
NODE* add_tail(NODE **phead, int data) {
  NODE *p, *new = (NODE *)malloc(sizeof(NODE));
  new->data = data;
  new->next = 0;
  if (*phead == 0) *phead = new;
  else
  {
    for (p = *phead; p->next; p = p->next);
    p->next = new;
  }
  return new;
}

在上面的函数中有一个单链表。节点由数据类型int和指向列表中下一个节点的指针组成。我们定义了两个函数。第一个更改头节点,或者在前一个头节点之前添加新的头节点。第二个函数添加尾节点(列表中的最后一个节点)。通常,我们这样称呼它们:

NODE *head = 0;
NODE *c1 = add_head(&head, 1);
NODE *c2 = add_tail(&head, 3);

现在,看看这个函数:

NODE* add_after(NODE *node, int data) {
  NODE *new = (NODE *)malloc(sizeof(NODE));
  new->data = data;
  new->next = node->next;
  node->next = new;
  return new;
}

该函数在参数节点后添加一个节点。在main中,如果要在先前定义的c1之后添加一个节点,则调用如下函数:

*c3 = add_after(c1, 4);

我的问题是:就参数而言,前两个函数和第三个函数有什么不同?在前两个函数中,我们有一个参数**phead,在第三个函数中,我们有一个参数*node。如果我们真的需要**phead,为什么我们不能把**phead放在main中,像这样调用它:

NODE *c1 = add_head(head, 1);

我希望你明白我的意思,我觉得很难解释。

  • 第一个元素(类型为NODE)的地址包含在一个类型为NODE *的指针中

  • add_head()函数修改该指针。由于使用C语言编程,明显缺乏按引用传递参数,因此唯一的选择就是传输其地址。

因此,参数类型为NODE**(指向NODE的指针的地址)。

  • 对于add_after(),参数给出要修改的节点的地址。你不需要修改地址。

相关内容

  • 没有找到相关文章

最新更新