链表中的指针

时间:2015-11-29 20:28:22

标签: c++ pointers linked-list singly-linked-list

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

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,new listNode(2)];
结果
HEAD = [1,POINTER] [2,NULL];

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

3 个答案:

答案 0 :(得分:2)

你可以这样想:不管你以前在while循环中做了什么,while循环的条件是这样的循环只会在n1成为{{{{}}后终止1}}。因此,null的值在循环后保证为n1

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

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

答案 1 :(得分:1)

很简单,

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]

所以,除非你将前一个元素的头部的下一个指针设置为你的新元素,否则它将无法正常工作

答案 2 :(得分:1)

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

您应该更改列表的原始节点。该功能可以按以下方式编写

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

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

    *node = new listNode( value );
}

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