为什么列表上的迭代失败?

时间:2013-12-10 04:45:32

标签: c++ linked-list

我目前正在通过Stanford开放的CS106B工作,我在Assignment 3,Part B上遇到了问题。我给了一个结构节点如下:

struct Node {
string name;   // my person's name
string killer; // who eliminated me
Node* next;    // ptr to next node
Node(string name, Node* next) {...}
};

我必须实现一个创建节点列表的类。我让构造函数正常工作,但是当我尝试遍历列表时,我的程序崩溃了。我的迭代代码:

void AssassinsList::printGameRing() {
    Node* current;
    for(current = ring; current->next != NULL; current = current->next) {
        cout << endl << "  " << current->name << " is targeting " << current->next->name;
    }
    cout << endl << "  " << current->name << " is targeting " << ring->name << endl;
}

但是,如果我使用for循环来循环我知道我需要一定列表长度的次数,它就可以工作。救命?作业链接pdf:http://www.stanford.edu/class/cs106b/homework/3-tiles-assassins/spec.pdf

谢谢!

4 个答案:

答案 0 :(得分:2)

我猜您没有将* next初始化为nullptr。因此,对于您在节点之间设置的所有链接,它很好,但列表中的最后一个对象指向垃圾。

抱歉,nullptr是c ++ 11。如果您的编译器较旧,那么它只是NULL

答案 1 :(得分:0)

如果cur为NULL或未指向任何内容,则可能会取消引用错误的指针,从而导致程序崩溃。另一个选择是,如woolstar所指出的那样,列表中没有终止节点(指向NULL)。请注意以下代码:

Node* head = new Node{0};
Node* cur = head;
for (int i = 1; i <= 10; i++)
{
    cur->next = new Node{i};
    cur = cur->next;
}

// Set terminating node
cur->next = nullptr;

// We'll iterate until cur is null
// So if we access cur->next
// It won't result in undefined behavior
for (cur = head; cur != nullptr; cur = cur->next)
{
    std::cout << cur->value;
}

// cur should be nullptr now
if (!cur)
    std::cout << "end of list";

答案 2 :(得分:0)

你也可以使用0.是的,它不像nullptr那么酷,但它是支持的。修复了构造函数:

Node(string name_, Node* next_=0): name(name_), next(next_) {}

答案 3 :(得分:0)

固定长度循环工作的事实,但是NULL终止循环不起作用表明它可能在最后一个节点的下一个字段中有一个无效地址。

我希望您的问题来自您的Node构造函数或列表代码或它们之间的相互作用。

尝试在Node构造函数中设置0 / nullptr旁边,这应该会有所帮助。

或者,当您将第一个元素添加到列表中时,让列表将下一个字段设置为0,或者将任何元素添加到列表的末尾。