C语言 反转传递指针地址的链表


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;

相关内容

  • 没有找到相关文章

最新更新