gpt4 book ai didi

c++ - 链表 - 新节点指针与新节点变量

转载 作者:行者123 更新时间:2023-11-28 00:05:16 25 4
gpt4 key购买 nike

我正在为练习创建一个链表,但遇到了一个问题。

我创建了两个相似的代码,在第一个代码中,我创建了一个名为 Node 的特定结构作为一个变量,在第二个代码中,我创建了一个结构作为指针调用Node

在我看来,它应该以相同的方式工作,但事实并非如此。我将发布代码并查看名为 addNode() 的函数。

我还有下一个问题:为什么我必须像这样传递指针:addNode( Node *& head, Node *& tail ) 以使其正常工作,而不是将它们作为 addNode( Node * head, Node * tail ).

第一个代码(错误):

#include <iostream>
#include <string>

using namespace std;

struct Node{
int val;
Node * prev;
Node * next;

Node( int val ) : val( val ) { }
};


void printList( Node * ptr ){
while( ptr != NULL ){
cout << ptr -> val << " ";
ptr = ptr -> next;
}
cout << endl;
}

void addNode( int val, Node *& head, Node *& tail ){
Node tmp( val );
if( head == NULL ){
head = &tmp;
tail = &tmp;
tmp . prev = NULL;
tmp . next = NULL;
}
else{
tail -> next = &tmp;
tmp . prev = tail;
tmp . next = NULL;
tail = &tmp;
}
}

int main(){

Node * head = NULL;
Node * tail = NULL;

addNode( 3, head, tail );
addNode( 8, head, tail );
addNode( 2, head, tail );
addNode( 4, head, tail );
addNode( 15, head, tail );
addNode( 11, head, tail );

/*Node b( 5 );

cout << b . val << endl;
*/
printList( head );
return 0;
}

第二个代码(好):

#include <iostream>
#include <string>

using namespace std;

struct Node{
int val;
Node * prev;
Node * next;

Node( int val ) : val( val ) { }
};


void printList( Node * ptr ){
while( ptr != NULL ){
cout << ptr -> val << " ";
ptr = ptr -> next;
}
cout << endl;
}

void addNode( int val, Node *& head, Node *& tail ){
Node * tmp = new Node( val );
if( head == NULL ){
head = tmp;
tail = tmp;
tmp -> prev = NULL;
tmp -> next = NULL;
}
else{
tail -> next = tmp;
tmp -> prev = tail;
tmp -> next = NULL;
tail = tmp;
}
}

int main(){

Node * head = NULL;
Node * tail = NULL;

addNode( 3, head, tail );
addNode( 8, head, tail );
addNode( 2, head, tail );
addNode( 4, head, tail );
addNode( 15, head, tail );
addNode( 11, head, tail );

/*Node b( 5 );

cout << b . val << endl;
*/
printList( head );
return 0;
}

最佳答案

如果您执行 Node tmp,则 tmp 在您退出定义它的范围后被销毁。

另一方面,执行 Node *tmp = new Node 会为堆上的 Node 分配内存,并为您提供一个指针 tmp给它。 Node 只有在您对其调用 delete 时才会被销毁。

来到问题的第二部分,如果您需要修改指针而不是指针指向的对象,您可能希望通过引用传递指针。

如果你执行 head = tmp, tail = tmp 而没有通过引用传递 headtail,那么 headtail 只会保留这个值直到这个函数的作用域。此更改不会反射(reflect)在 addNode() 之外。

关于c++ - 链表 - 新节点指针与新节点变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36082390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com