任何人都可以告诉我为什么这个功能不是最后添加节点,我该如何解决?

时间:2017-09-05 09:29:57

标签: c nodes

这是c语言代码:

struct node
{
  int num;
  struct node* next;
};

void add_last(struct node* head,struct node* new_node)
{
  new_node->next=head;
  head=new_node;
}

我不需要代码,我只想了解为什么这不起作用 提前谢谢。

4 个答案:

答案 0 :(得分:1)

因为C是按值调用的。您无法在函数内更改参数的值(如head),并期望调用者注意。

这应该是一个骗局,但我找不到它。

有两种基本方法可以修复它:

  • 返回新值,或
  • 将指针传递给值,以便函数可以修改它。

如果可能的话,前者通常更清洁。

这样就可以了:

struct node * add_last(struct node *head, struct node *new_node)
{
  new_node->next = head;
  return new_node;
}

答案 1 :(得分:1)

语言参数按值传递,因此函数对此指针副本所做的更改仅在函数体中生效,之后从范围中删除指针的更改副本并且丢失了

如果你想传递'引用'(不支持像这样的实际引用)并修改这个指针,你必须传递指向你要修改的指针,比如

struct node * add_last(struct node **head, struct node *new_node)
//                                 ^^
{
  new_node->next = head;
  head=new_node;
}

// Calling
add_last(&head, new_node);

第二个机会是返回此指针

struct node * add_last(struct node *head, struct node *new_node)
{
  new_node->next = head;
  return new_node;
}

// Calling
head = add_last(head,new_node);

答案 2 :(得分:0)

由于C是“按值传递”语言,因此语句head = ...;仅在函数体内生效。如果你想改变头部指针,你需要解除引用并分配它。

答案 3 :(得分:0)

尝试回答以下问题:

鉴于这些程序片段:

int foo(int a)
{
  a = 1234;
}

...
int bar = 1;
foo(bar);
// what's the value of bar here

调用bar之后foo的价值是什么?

1或1234?