2013-12-10 4 views
0

Я сейчас работаю свой путь через Стэнфордского открытой CS106B, и я бегу в проблему об уступке 3, Часть B. Я дал STRUCT узел следующим образом:Почему итерация в моем списке не работает?

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; 
} 

Однако, если я использую для цикла в цикле число раз, я знаю, что нужно для определенной длины списка, он работает. Помогите? Ссылка на задание pdf: http://www.stanford.edu/class/cs106b/homework/3-tiles-assassins/spec.pdf

Спасибо!

+0

Я как-то не могу обнаружить ошибки в коде, который вы указали. Вам нужно будет показать больше кода. –

+0

в вашем printGameRing вы адресуете «следующий», но в вашей структуре (которую вы показываете) нет такого участника, как вы ожидаете от нас помощи, если вы не показываете соответствующие части? –

+0

он проверяет перед current-> next! = NULL, так что текущая-> следующая будет тобой – sam

ответ

2

Я предполагаю, что вы не инициализируете * next до nullptr. Таким образом, для всех ссылок, которые вы устанавливаете между узлами, все хорошо, но последний объект в списке указывает на мусор.

Извините, nullptr C++ 11. Если ваш компилятор старше, то его просто NULL.

+0

А ... Вы правы, сэр. Я слишком сосредоточен на цикле, чтобы заметить, что мой первый следующий указатель был настроен на цель, но цель не была установлена ​​в нуль. Благодаря! – br1992

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"; 
0

Вы также можете использовать 0. Да, это не как прохладно, как nullptr, но поддерживается. Фиксированный конструктор:

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

Тот факт, фиксированная длина цикла работ, но NULL завершается цикл не работает, показывает, что его, вероятно, у вас есть недопустимый адрес в следующем поле последнего узла.

Я ожидаю, что ваша проблема исходит либо от вашего конструктора узла, либо от вашего кода списка, либо от взаимодействия между ними.

Попробуйте установить рядом с 0/nullptr в конструкторе узла, который должен помочь.

В качестве альтернативы, укажите, что ваш список задает следующее поле: 0, когда вы добавляете первый элемент в список или добавляете любой элемент в конец списка.

+0

Спасибо! – br1992

Смежные вопросы