Ваш код показывает хорошую мысль, поэтому учтите: указатель head
должен указывать на ведущий элемент списка, не так ли?Однако единственные строки в вашем коде, которые присваивают значение head
, присваивают NULL
(должно быть nullptr
, между прочим).
Это было бы проблемой.
С момента изменениятип возврата insertAtEnd()
в вашей задаче запрещен, мы должны вызывать эту функцию только тогда, когда head
уже имеет значение, как
if (head != nullptr) {
// call insertAtEnd()
}
else {
// do something to start the list and, incidentally,
// to assign a value to head
}
На самом деле, это способ написания для начинающих.Более бегло бы было
if (head) {
// ...
, что означает то же самое.
В любом случае, если вы сделаете это таким образом, вы можете и, вероятно, должны сделать свою функцию insertAtEnd()
более простой, потому что она не будетбольше нужно обрабатывать случай пустого списка.
[...]
Теперь вы поработали еще немного.Ваш вывод все еще не то, что вы ожидаете, так как его отладить?Если у вас есть проблема, но вы не знаете, где в вашем коде ошибка, как вы должны ее локализовать?То есть, как вы должны выяснить, по какой линии возникает проблема?Программа слишком большая, чтобы найти проблему, просто взглянув на код!
Для отладки я бы попробовал что-то вроде этого:
Node *load (string filename) {
Node *head;
string num;
ifstream myfile(filename.c_str());
cerr << "diagn 100\n";
while(myfile >> num) {
cerr << "diagn 150\n";
if(head) {
cerr << "diagn 200, head == " << head << "\n";
int num1 = stoi(num);
insertAtEnd(head, num1);
cerr << "diagn 250\n";
}
else {
cerr << "diagn 300, head == " << head << "\n";
head = createNewList();
cerr << "diagn 325, head == " << head << "\n";
int num1 = stoi(num);
head = createNewNode(num1);
cerr << "diagn 350, head == " << head << "\n";
}
}
myfile.close();
cerr << "diagn 900, head == " << head << "\n";
return head;
}
Скорее всего, большинство этих выходов напоток ошибок ничего не скажет, что вы еще не знали, но один или несколько выходных данных могут выглядеть неправильно.Когда вы найдете тот, который выглядит неправильно, если таковой имеется, он скажет вам, на чем следует сосредоточить ваше внимание при отладке.
(Кстати, «диагноз» означает «диагностика». Мне нравится «диагностика», потому что нетдругое английское слово, которое я использую, содержит эти буквы, поэтому его легко найти в тексте программы.)
Что касается потока ошибок, std::cerr
, он по умолчанию отправляет вывод в то же место, что и std::cout
.Тем не менее, можно перенаправить один поток или другой, или оба, отправив два в разные места.Точный способ переадресации зависит от того, какую систему (Debian, Windows, OSX и т. Д.) Вы используете, но переадресацию обычно не составляет труда.