繁体   English   中英

链表中的指针

[英]Pointers in linked lists

我目前正在研究列表(试图重新创建它们),但遇到了一个奇怪的问题。 这是我的结构:

struct listNode{
    listNode(int n, listNode* ne = NULL){
        value = n;
        next = ne;
    }
    int value;
    listNode* next;
};
listNode* head = NULL;

现在,我做了一个函数,将元素添加到底部:

void add(int n){
    if(head == NULL){
        head = new listNode(n);
        return;
    }
    listNode* n1 = head;
    while(n1 != NULL){ //Should be: while(n1->next != NULL){
        n1 = n1->next;
    }
    n1 = new listNode(n); //Should be: n1->next = new listNode(n);
}

但这并没有增加任何其他因素。 现在,我已经找到了解决方案(请参阅上面的注释),我的问题是我不明白为什么我的第一个功能无法正常工作。
我将用一个方案解释我的理解:

起点
HEAD = NULL;

我加1
HEAD = [1,NULL];

我加2
while循环到达最后一个元素(其中“ next”为NULL)并在其中创建新元素
HEAD = [1,新的listNode(2)];
结果
HEAD = [1,POINTER] [2,NULL];

现在,为什么while循环之后的n1不是我想要的?

您可以这样想:无论您在while循环中曾经做过什么, while循环的条件都是这样,使得循环仅在n1变为null终止。 因此,保证循环后n1的值为null

但是,while循环之后的n1值是无关紧要的,因为在while循环之后您没有使用它。

另一方面,您的最后一条指令是n1 = new listNode(n); 因此,您正在创建一个新的listNode,并将其分配给n1 ,然后通过离开该函数将其永远遗忘。 (因此,新节点被泄漏。)

很简单,

while(n1 != NULL){
    n1 = n1->next;
}

// n1 here is null
// head here is [1, NULL]

n1 = new listNode(n);

// n1 here is something
// head here is [1, NULL]

因此,除非您将头部的上一个元素的下一个指针设置为新元素,否则它将不起作用

该函数无效,因为n1是该函数的局部变量。 变量的任何更改都不会影响列表的其他节点。

您应该更改列表的原始节点。 该函数可以通过以下方式编写

void add( int value )
{
    listNode **node = &head;

    while ( *node ) node = &( *node )->next;

    *node = new listNode( value );
}

在这种情况下,由于变量node指向列表的实际字段,因此确实会更改它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM