我正在研究一个链表示例。但是,我目前无法理解head_insert方法。请有人再解释一下。谢谢。
#include <iostream>
using namespace std;
struct node_ll
{
int payload;
node_ll* next; // pointer to the next node
};
void head_insert(node_ll** list, int pload)
{
node_ll* temp = new node_ll;//Declare temp, a pointer to a node.
temp->payload = pload;//Set the payload of the struct at the address of temp to pload.
temp->next = *list;//Set the next of the struct at the address of temp to the pointer to the old head of the list.
*list = temp;//Set the pointer to the old head of the list to the pointer to the temp node.
//Why doesnt the temp->next = temp?
};
void print_ll(node_ll** list)
{
node_ll* temp;
temp = *list;
while (temp) // != NULL
{
cout << temp->payload << '\n';
temp = temp->next;
};
}
int main()
{
node_ll* alist = NULL;
cout << "Empty list a to start\n";
head_insert(&alist, 2);
head_insert(&alist, 4);
head_insert(&alist, 6);
cout << "List a after head insertion of 2,4,6 is \n";
print_ll(&alist);
cout << '\n';
system("PAUSE");
return 0;
}
评论中详细说明了我的困惑。如果我有行
temp->next = *list;
*list = temp;
为什么新创建的节点在下一个节点中没有指向自己的地址?
答案 0 :(得分:1)
//Declare temp, a pointer to a node.
没有。 &#34;创建一个新节点,让temp
成为该节点的地址。&#34;
//Set the payload of the struct at the address of temp to pload.
没有。 &#34;将地址为 payload
的struct 的temp
设置为pload&#34;。这可能就是你的意思,但你真的需要准确地了解这些事情。无论如何,这填补了我们刚刚创建的新节点的payload
。
//Set the next of the struct at the address of temp to the pointer to the old head of the list.
同样地......&#34;将地址为 next
的struct 的temp
设置为地址旧头list
。&#34;
//Set the pointer to the old head of the list to the pointer to the temp node.
小心。事情就是这样:&#34;列表旧头的地址&#34;是值,而不是变量。它可以存在于内存中的多个位置,就像数字4
可以存储在内存中的多个位置一样。
该函数被赋予node_ll**
,即(node_ll*)*
- 指向node_ll*
的指针。具体来说,当我们从main
调用该函数时,我们在当前对a_list
的调用中为变量main
指定了一个指针。
因此,当我们执行*list =
时,我们正在写那个内存位置 - 实际上,替换了a_list
变量。使用这样的内存地址可以让我们模拟&#34;通过引用传递&#34;并改变来自调用者的变量的值(我们不能从参数中访问这些变量,因为我们得到了一个副本;而且我们无法将它们作为全局变量访问,因为它们不是全局)。
//Why doesnt the temp->next = temp?
为什么会这样?代码从上到下(尽管有控制结构)。 temp->next
已设置为列表的旧头部,之前我们设置列表的新头部。
好像你期望temp->next
改变只是因为,在这个过程中,它碰巧指向列表的旧头,然后我们改变了一个也碰巧有相同的变量值 - 即指向列表的旧头部。但它们是非常清楚的单独变量。如果我写a = 4; a *= 3
,则值4不会改变;变量a
的确如此。所以它也是指针;他们只是另一种价值。
答案 1 :(得分:0)
这是令人困惑的代码。
list
是指向节点的指针的指针。 *list = temp
不更改任何节点,它正在更改传入的指针,因此它指向插入的节点。
答案 2 :(得分:0)
在您的head_insert
功能中,新节点将添加到开头。即新的新节点将成为链表的头部
temp->next = *list;//Store pointer to earlier head as the next node
*list = temp; // Make pointer new node as the head node
在您的代码中,双指针作为参数传递给函数。
即如果A
是您的指针头节点,那么包含B
的地址A
将作为参数传递到您的函数中。