struct node {
char name[20];
int age;
int height;
node* next; // Pointer to the next node
};
node* startPTR = NULL; // global
void addNode_AT_END() {
node *temp1;
node *temp2;
temp1 = new node;
cout << "Enter the name : ";
cin >> temp1->name;
cout << endl << "Enter the age : ";
cin >> temp1->age;
cout << endl << "Enter height : ";
cin >> temp1->height;
temp1->next = NULL;
if( startPTR == NULL) {
startPTR = temp1;
} else {
temp2 = startPTR;
while( temp2->next != NULL )
temp2 = temp2->next;
temp2->next = temp1;
}
}
在此代码段中,当函数第三次调用时,其余部分起作用。
startPTR
的地址已分配给temp2
。现在,在while循环中检查条件时,temp2->next
包含什么? (在第三次 call 期间)如果您说它包含第二个节点的地址,请告诉它它如何知道第二个节点的地址,因为在第二次 call 中我们已经将第二个节点的地址分配给了第一个节点函数使用temp2->next = temp1
语句,但是由于它是局部作用域,因此我们松开了地址。这就是我目前的想法。请说明在第三次调用函数时如何检查条件以及如何形成链表?
最佳答案
只有指针变量temp1
和temp2
属于本地范围。实际的链表节点节点(类型struct node
)是通过对new
的调用分配的。堆分配的数据将一直保留,直到通过调用delete
将其释放为止。
这意味着temp2->next = temp1
行存储了追加到列表尾部的新节点的地址,并且此信息可在后续对函数addNode_AT_END
的调用中使用。
该代码似乎有各种各样的问题-您正在使用全局变量,除非在内存泄漏的某个地方有后续对delete
的调用,否则已经有std容器类std::list
可用了...
希望这可以帮助。
编辑:关于您的评论-当您调用new node
时,您正在堆上构造一个node
对象。在后续调用delete
之前,该对象将一直可用。
当您调用temp2->next = temp1
时,将满足以下条件:
temp2
指向列表中最后一个节点存储在内存中的地址(该节点将由上次迭代中对new
的调用创建)。 temp1
的值被分配为列表中最后一个节点(即next
“指向”的数据)的temp2
指针。这意味着该地址存储在堆上,而不是在本地temp2
指针变量内。 当函数退出时,是的,本地指针变量
temp1
和temp2
超出范围,但是分配的堆分配的链表节点没有被破坏-这是地址的存储位置。编辑:第二条注释-在该函数的
else
分支中,指针temp2
初始化为使用temp2 = startPTR;
行指向列表的头部接下来的几行(
while
循环)从头节点遍历链接列表,直到指针temp2
指向列表中的最后一个节点为止(直到temp2->next = NULL
)。如上所述,在此阶段,新节点将添加到列表中。
关于c++ - 当第三个调用temp2-> next由于本地作用域而被破坏时,如何访问第二个节点的地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7266236/