簡體   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