0

我正在处理一个链表示例。但是,我目前无法理解 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;

为什么我新创建的节点在 next 中没有指向它自己的地址?

4

3 回答 3

1
//Declare temp, a pointer to a node.

不。“创建一个新节点,并让temp成为该节点的地址。”

//Set the payload of the struct at the address of temp to pload.

不。“设置要加载payload的结构的地址 temp”。这可能就是您的意思,但是您确实需要对这些事情保持精确。无论如何,这是在填充payload我们刚刚创建的新节点。

//Set the next of the struct at the address of temp to the pointer to the old head of the list.

类似地......“将地址设置为旧头地址next的结构的。” templist

//Set the pointer to the old head of the list to the pointer to the temp node.

小心。事情是这样的:“旧列表头的地址”是一个,而不是一个变量。它可以存在于内存中的多个位置,就像数字4可以存储在内存中的多个位置一样。

该函数被赋予a node_ll**,即a (node_ll*)*- 指向a 的指针node_ll*。具体来说,当我们从 调用函数时main,我们给了它一个指向当前调用中的变量a_listmain的指针。

因此,当我们这样做时*list =,我们正在写入内存位置 - 实际上是替换a_list变量。像这样使用内存地址可以让我们模拟“通过引用传递”并更改来自调用者的变量的值(我们不能只从参数中访问这些,因为我们得到了一个副本;我们不能将它们作为全局变量访问,因为它们不是全局变量)。

//Why doesnt the temp->next = temp?

为什么会呢?代码从上到下运行(尽管有控制结构)。在我们设置新的列表头之前temp->next,被设置为列表的头。

似乎您希望temp->next更改只是因为在该过程中,它碰巧指向列表的旧头,然后我们更改了一个也碰巧具有相同值的变量 - 即指向名单的老头。但它们显然是独立的变量。如果我写a = 4; a *= 3,值 4 不会改变;变量a确实如此。指针也是如此;它们只是另一种价值。

于 2013-04-11T07:00:11.773 回答
0

这是令人困惑的代码。

list一个指向节点的指针。*list = temp没有改变任何节点,它改变了传入的指针,所以它指向插入的节点。

于 2013-04-11T06:48:34.803 回答
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作为参数传递给您的函数。

于 2013-04-11T06:49:52.437 回答