C - 单链表 - 按值和引用传递指针

时间:2015-05-31 11:21:53

标签: c pointers linked-list

<%= link_to "Home", main_app.root_path %>

我们在功能中有如上所示的单链表。该节点由数据类型int和指向列表中下一个节点的指针组成。我们定义了两个函数。第一个更改头节点,或在前一个头节点之前添加新的头节点。第二个函数添加尾节点(列表中的最后一个节点)。在主要内容中,我们称之为:

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

现在,看看这个功能:

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

该函数在参数节点后添加一个节点。并且,在main中,如果我们想要在先前定义的c1之后添加节点,我们将调用函数:

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

我的问题是:根据参数,前两个和第三个函数之间有什么区别。在前两个函数中,我们有一个参数** phead,在第三个函数中,* node。我们真的需要** phead,为什么我们不能把* phead和主要调用它一样:

*c3 = add_after(c1, 4);

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

1 个答案:

答案 0 :(得分:1)

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

  • add_head()函数修改此指针。当您使用C编程时,显然缺少参数传递参考,您唯一的选择是传输其地址。

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

  • for add_after()该参数给出了要修改的NODE的地址。您不必修改该地址。