C++链表节点创建导致无限循环



我正试图创建一个简单的双链表,以熟悉c++中的指针。每个节点都包含一个整数、一个指向下一个节点的指针和一个指向上一个节点。当我试图输出链表对象中每个节点的值时,它会无限期地打印值。

我的测试代码初始化了一个带有一个节点的链表,并添加了另外3个节点。

当调用PrintNodeVals()方法时,while循环无限期迭代,输出恒定的节点值流。当使用for循环而不是while循环时,它会打印一次头节点的地址,然后连续打印第二个地址,这是使用addnode()方法连接的第一个节点,也是整个链表中的第二个节点。

我能想到的唯一解释是,我的代码以某种方式将第二个节点的"下一个"指针分配给了节点本身,这将导致PrintNodeVals()while循环始终计算为true。

有什么想法吗?

#include "LinkedList.h"
LinkedList::LinkedList(){
    root = new Node();
}
//adds node to the end of the list
void LinkedList::addnode(){
    Node newnode;
    Node *conductor = root;
    while(conductor->next != 0){
        conductor = conductor->next;  //(*conductor).next
    }
    conductor->next = &newnode;  //makes the next field point to the new       node
    newnode.prev = conductor;
}
void LinkedList::PrintNodeVals(){
    Node *conductor = root;
    while(conductor != 0){
        std::cout << conductor->val;
        conductor = conductor->next;
    }

    /*
    for(int i = 0; i < 10; i++){
        std::cout << conductor << "n";
        conductor = conductor->next;
     */
    }
}
//TEST CODE
#include <iostream>
#include "LinkedList.h"
using namespace std;
int main()
{
    LinkedList linkle;
    linkle.addnode();
    linkle.addnode();
    linkle.addnode();
    linkle.ShowNodeVals();
    return 0;
}

创建newNode时应该分配空间(它应该是指向节点的指针)。

记住,双链接线性列表的模型应该是将您的节点连接到列表(您所指向的列表),然后将列表连接到节点。

Node *newNode = new Node();
newNode->data = element //Set your element in your node here
Node *conductor = root;
while (conductor->next != nullptr) {
     conductor = conductor->next;
     }
//So you will be connecting your new element like:
newNode->next = nullptr; //Connect node in last position
newNode->prev = conductor; //Connect node to previous position which should be stored by conductor doing that loop
//Then connect the list to the new node
conductor->next = newNode;

此外,您可能需要检查构造函数,并确保列表中的第一个元素(在那里创建)在两侧都指向NULL。

记住,只有当你将元素添加到列表的最后一个位置时,这才有效,如果你在位置上插入元素,那么你应该考虑各种情况,以生成一些非常有趣和漂亮的代码!

希望这能有所帮助!

p.D:如果你需要更多的帮助,就发个信息吧

问题是您在列表中存储了一个指向本地变量的指针:

Node newnode;
// ... 
conductor->next = &newnode;

newnode在块的末尾被破坏,并且指针变为无效。您可能应该动态地分配新节点,或者使用std::list而不是您自己的列表类。

相关内容

  • 没有找到相关文章

最新更新