[英]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.