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 "),而snoc所做的是将值放在列表的最后一个链接。
我的问题是,为什么我们必须传递"l"什么时候调用函数?为什么在标题的反向,有&;LInt *l&;?它是指向我传递的地址的指针吗?
如果这是个愚蠢的问题,如果我犯了语法错误(英语不是我的母语),我很抱歉。
提前感谢。
答案1(为什么在调用函数时必须传递"l"的地址?)
假设reverse()
函数改变原始列表。但是函数的非数组输入是inputs
,它们是按值传递的。不影响原l
。因此,要更改l
,您将其地址传递给reverse()
。这允许reverse()
改变l
,因为它知道l
在哪里。
答案2(为什么在反向标题上有"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.
定义typepedef LInt为指向结构的指针
typedef struct slist *LInt;
这就是为什么你不指定'next'作为LInt next;在结构。
如果你将typedef定义为
typedef struct slist LInt;
则传递参数LInt *l是有效的。你正在传递一个结构指针。
Typedef是帮助你创建一个小的可理解的数据类型(同义词不是一个新的)
考虑这样定义:
typedef struct slist LIST; //i prefer this mostly
typedef struct slist * LIST_PTR;
所以当你定义新列表时,它不会让你感到困惑。
LIST *head; //creating a pointer - Head of linkedlist
LIST_PTR head;