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

时间:2015-11-20 06:11:33

标签: c++ pointers linked-list doubly-linked-list

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

我的测试代码使用一个节点初始化链接列表,并添加另外3个节点。

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

我能想到的唯一解释是我的代码以某种方式分配了第二个节点" next"指向节点本身的指针,这将导致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;
}

2 个答案:

答案 0 :(得分:1)

问题是你在列表中存储了一个指向局部变量的指针:

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

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

答案 1 :(得分: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:如果您需要更多帮助,请发送消息。 :)