0
typedef struct slist *LInt;

typedef struct slist{

int value;
LInt next;
}Node;

void reverse(LInt *l){

LInt tail;
if(*l){
    tail=(*l)->next;
    reverse(&tail);
    snoc(&tail,(*l)->value);
    free(*l),
    *l=tail;
    }
}

在 main 上,我这样调用函数:reverse(&l); (l 是“LInt l”)并且 snoc 所做的是将值放在列表的最后一个链接。

我的问题是,为什么我们在调用函数时必须传递“l”的地址?为什么在反向的标题上,有“LInt *l”?它是指向我传递的地址的指针吗?

如果这是一个愚蠢的问题,我很抱歉,如果我犯了任何语法错误(英语不是我的母语)。

先感谢您。

4

2 回答 2

0

您将 typedef LInt 定义为 POINTER TO STRUCTURE

    typedef struct slist *LInt;            

这就是为什么您不将 'next' 指定为 LInt next 的原因;在结构上。

如果您将 typedef 定义为

    typedef struct slist LInt;

那么传递参数 LInt *l 是有效的。您正在传递一个结构指针。

typedef 是为了帮助你创建小的 UNDERSTANDABLE 数据类型(同义词不是新的)

考虑这样定义:

   typedef struct slist LIST;  //i prefer this mostly
   typedef struct slist * LIST_PTR; 

因此,当您定义新列表时,它不会让您感到困惑。

   LIST *head;  //creating a pointer - Head of linkedlist
   LIST_PTR head;
于 2013-05-27T15:56:52.280 回答
0

答案1(为什么我们在调用函数时要传递“l”的地址?)

该功能reverse()假设更改原始列表。但是函数的非数组输入是inputs,它们是按值传递的。它们不影响原来的l。所以要改变l,你把它的地址传给reverse(). 这允许reverse()更改l,因为它知道l存在的位置。

答案2(为什么在reverse的标题上,有“LInt *l”?)

见答案1。 reverse需要知道一个类型的地址LInt才能影响变化。

例子:

int x,y;   // 2 non-array variables.
y = f(x);  // X does not change.  You expect y to change.
g(&x);     // After g() is done, the value of x may have changed.
           // Of course, the _address_ of x, being what you passed to g(), did not change.
于 2013-05-27T15:22:43.047 回答