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语句,但是由于它是局部作用域,因此我们松开了地址。

这就是我目前的想法。请说明在第三次调用函数时如何检查条件以及如何形成链表?

最佳答案

只有指针变量temp1temp2属于本地范围。实际的链表节点节点(类型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指针变量内。

  • 当函数退出时,是的,本地指针变量temp1temp2超出范围,但是分配的分配的链表节点没有被破坏-这是地址的存储位置。

    编辑:第二条注释-在该函数的else分支中,指针temp2初始化为使用temp2 = startPTR;行指向列表的头部

    接下来的几行(while循环)从头节点遍历链接列表,直到指针temp2指向列表中的最后一个节点为止(直到temp2->next = NULL)。

    如上所述,在此阶段,新节点将添加到列表中。

    关于c++ - 当第三个调用temp2-> next由于本地作用域而被破坏时,如何访问第二个节点的地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7266236/

    10-12 05:48