2

在我将新节点添加到列表末尾的情况下,以下工作正常:

typedef struct node* edge;
struct node
{
   int data;
   edge next;
};

void add(edge start, int val)
{
   edge n = malloc(sizeof(struct node));
   n->data = val;
   n->next = NULL;

   while (start->next)
      start = start->next;

   start->next = n;
}

但是,如果我将主体更改add()为:

edge n = malloc(sizeof(struct node));
n->data = val;
n->next = start;

start = n;

什么都没有添加。

我期待新节点成为我列表的新起点,之前的起点是第二个。为什么第一个实现按预期工作而不是第二个?实现我对第二种方法所期望的功能的最佳方法是什么,可以用 void 函数来完成吗?

4

2 回答 2

3

这是因为指针是按值传递的,这意味着当你这样做时

start = n;

只有您传递的指针的本地副本被更改。要解决此问题,请将 start by 指针传递给指针:

void add(edge* start, int val)
{
    edge n = malloc(sizeof(struct node));
    n->data = val;
    n->next = *start;

    *start = n;
}
于 2012-11-10T03:43:34.843 回答
1

请记住,C 中的变量是“按值”而不是“按引用”传递的。因此,当您start = n在第二个代码中进行设置时,该更改不会反映在代码中的任何其他位置。相反,请执行以下操作:

edge add(edge start, int val)
{
   edge n = malloc(sizeof(struct node));
   n->data = val;
   n->next = start;
   return n;
}

或者,对于按引用的解决方案:

void add(edge* start, int val)
{
   edge n = malloc(sizeof(struct node));
   n->data = val;
   n->next = *start;
   *start = n;
}

在此处使用指针可为您提供对 an 的引用edge,然后您可以在函数和调用者中对其进行修改。(但是,如果您更改指针“start”的值而不取消引用它,请注意该更改是函数的本地更改。)

于 2012-11-10T03:44:37.807 回答