Я уже некоторое время работаю над этим и не могу понять, как правильно перебирать мой связанный список. Прямо сейчас я могу запустить программу, и она запускается, но я не получаю никаких результатов из связанного списка. это мой код
вот что должно произойти.
Это мой результат. Но это также сразу падает
#ifndef LList_h
#define LList_h
#include <iostream>
#include "node.h"
class LList
{
public:
LList(void); //constructor
LList(const LList &); //copy constructor
~LList(); //destructor
LList *next; //points to next node
void push_back(const string &str);
void push_front(const string &str);
friend ostream& operator<<(ostream& out, const LList& llist);
LList &operator=(const LList &l);
private:
Node *_head;
Node *_tail;
string _str;
};
inline LList::LList(void) {
cerr << "head = tail = 0 at 0024f8d0\n";
_head = 0;
_tail = 0;
}
inline void LList::push_back(const string &_str) {
Node *p = new Node(_str);
if (_tail == 0) {
_tail = p;
} else {
_tail ->next(p);
_tail = p;
}
}
inline void LList::push_front(const string &_str) {
Node *p = new Node(_str);
if (_head == 0) {
_head = p;
} else {
_head ->next(p);
_head = p;
}
}
ostream &operator <<( ostream &out, const LList & llist ) {
for( LList *p = llist.front; p != 0; p = p -> next )
out << p;
return out;
}
LList & LList::operator=(const LList &l) {
_head = 0;
_tail = 0;
return *this;
}
#endif
Похоже, что в исходном коде может быть несколько проблем. Учитывая обсуждение выше и некоторые ответы, я бы рекомендовал начать с чего-то более простого. Получите это, а затем постепенно расширяйте его, пока не получите то, к чему изначально стремились.
Я бы начал с реализации очень простого односвязного списка без использования классов. Определите структуру, содержащую указатель на структуру того же типа и поле данных (может быть просто целым числом).
Создайте примерно три переменные этой структуры и свяжите их вместе, чтобы первая указывала на вторую, вторая указывала на третью, а третья указывала на NULL (по которой вы можете определить конец списка).
Затем продемонстрируйте итерацию по списку. Очень распространенная идиома в C такова:
for (ptr = &first; ptr; ptr = ptr->next)
{
printf("%p %d\n", ptr, ptr->data);
}
Убедитесь, что вы понимаете, почему это работает, и используйте его, чтобы освоиться с указателями и как работают связанные списки. Потренируйтесь в использовании отладчика для пошагового прохождения по списку и убедитесь, что вы понимаете, как цикл завершается, когда вы добираетесь до конца списка.
Когда вы довольны этим, непременно оберните его в класс и добавьте методы, такие как push_back () и push_front (), и перегрузите некоторые операторы.
Но сначала убедитесь, что вы хорошо разбираетесь в основах.
Что это Node::next(Node *p)
функцию делать?
Если это устанавливает следующее поле this
в p
, то этот код в вашем push_front
функция, вероятно, неверна:
else
{
_head ->next(p);
_head = p;
}
Вместо этого следует:
p.next
в _head
, (голова сейчас следует p
)_head
в p
, (новая голова p
)