为什么要传递一个指针给另一个指针来操作链表?为什么我们不能直接传递指针呢?我只是不明白发生的事情的内在逻辑。
我认为传递到列表的指针就足够了,但显然不是。
这取决于您的链表实现,但是为了便于讨论,如果您已经实现了一个push
函数,如下所示:
typedef struct linked_list linked_list;
struct linked_list
{
int value;
linked_list *next;
};
void push(linked_list **head, int value)
{
linked_list *temp = *head;
*head = malloc(sizeof(linked_list));
(*head)->value = value;
(*head)->next = temp;
}
则指向指针的指针是必要的,否则,您将修改push
的本地head
变量,而不是调用者的。
在C语言中,如果你想传递一个可能被函数修改的参数,你可以传递一个指向包含修改值的变量的指针:
void swap(int *i, int *j) // modifies the two parameter.
现在,如果这个形参本身是指针,你必须传递一个指针给另一个指针。以insert函数为例,它在列表前面插入一个单元格。如果将列表表示为指向其第一个元素的指针,则必须修改该指针。所以你给它传递一个指针:
typedef struct cell *list
void insert(list *pl, struct cell *pc)
^^
由于list本身是一个指针,因此它是指向指针的指针,因为list *
与struct cell **
相同。
没有一行的答案
看一下第12页(push())在此文档中:http://cslibrary.stanford.edu/103/LinkedListBasics.pdf
对我来说是最好的解释。