我有这个练习,要求我创建一个函数,它根据包含一个整数的结构将新节点中的数字添加到链表的头部。这是结构:
struct Node
{
int data;
struct Node *next;
};
直到现在还没问题。所以我创建了一个带有2个参数的参数:要添加的整数和指向链表头部的指针,但它不起作用。这是我的代码:
void push(struct Node* head, int new_data)
{
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = head;
head = new_node;
}
所以,我做的是我将 new_node 指向 head 所指向的同一节点,之后我将新节点作为链接的新头名单。这似乎很合乎逻辑,虽然它不起作用。另一方面,当我给函数指定 head 指针的地址而不是指针本身时,它确实有效:
void push(struct Node** head_ref, int new_data)
{
/* 1. allocate node */
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
/* 2. put in the data */
new_node->data = new_data;
/* 3. Make next of new node as head */
new_node->next = (*head_ref);
/* 4. move the head to point to the new node */
(*head_ref) = new_node;
}
这是双**的函数的主要内容:
int main()
{
struct Node* head = NULL;
push(&head,7);
push(&head,6);
push(&head,3);
return 0;
}
我理解第二个功能应该有效,但我不明白为什么有必要使用 head 的地址而不是 head 本身。如果有人能向我解释原因,我会很高兴,谢谢。
答案 0 :(得分:2)
但我不明白为什么有必要使用头部的地址而不是头部。
在普通的c代码中,你不能有引用(与c ++相反),而只是指针。
head
指针变量中存储的值应该从调用push()
中更改,因此您需要传递head
变量的地址来更改({* 1}}指针)值。
int main()
{
struct Node* head = NULL;
push(&head,7);
// ...
}
void push(struct Node** head_ref, int new_data)
{
// ...
/* 3. Make next of new node as head */
new_node->next = (*head_ref); // Dereferencing head_ref yields the current
// content of head
/* 4. move the head to point to the new node */
(*head_ref) = new_node; // Store the newly allocated memory address
// into the head pointer
}
当您使用c ++代码标记问题c++时,这是不必要的。
您也可以通过引用获取指针参数:
void push(struct Node*& head_ref, int new_data)
// ^
{
// ...
/* 3. Make next of new node as head */
new_node->next = head_ref;
/* 4. move the head to point to the new node */
head_ref = new_node; // <<<<<<<<<<
}
int main() {
struct Node* head = nullptr;
push(head,7);
push(head,6);
push(head,3);
return 0;
}