插入到链表头部时指针混乱

时间:2013-04-11 06:43:19

标签: c++ linked-list

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

为什么新创建的节点在下一个节点中没有指向自己的地址?

3 个答案:

答案 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将作为参数传递到您的函数中。