【问题标题】:C - Singly linked list - passing a pointer by value vs by referenceC - 单链表 - 按值传递指针与按引用传递
【发布时间】:2015-05-31 11:21:53
【问题描述】:
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);

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

【问题讨论】:

    标签: c pointers linked-list


    【解决方案1】:
    • 第一个元素的地址(NODE 类型)包含在一个指针(NODE * 类型)中

    • add_head() 函数修改此指针。当您在 C 中编程时,明显缺乏通过引用传递参数,您唯一的选择是传输其地址。

    所以,参数的类型是NODE**(指向节点的指针的地址)。

    • 对于add_after(),参数给出了要修改的节点地址。您不必修改该地址。

    【讨论】:

    • NODE* add_head(NODE *phead, int data) { NODE *new = (NODE *)malloc(sizeof(NODE)); new->data = data; new->next = phead; phead = new; return new; } 如果我们有这个功能会发生什么?
    • @A6SE 好吧,如果您尝试使用 add_head 函数构建一个列表,然后打印它的第一个元素,您会自己看到。最好尝试而不是推测(或相信而不是看到)。
    • 编辑部分的图片让我明白了:D 编辑:无法发布图片,但这是链接:scontent-fra3-1.xx.fbcdn.net/hphotos-xpf1/v/t35.0-12/…
    猜你喜欢
    • 2023-03-02
    • 2011-05-08
    • 2017-03-04
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多