Не удается перебрать мой связанный список в переполнении стека

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

Это мой результат. введите описание изображения здесь Но это также сразу падает

#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

0

Решение

Похоже, что в исходном коде может быть несколько проблем. Учитывая обсуждение выше и некоторые ответы, я бы рекомендовал начать с чего-то более простого. Получите это, а затем постепенно расширяйте его, пока не получите то, к чему изначально стремились.

Я бы начал с реализации очень простого односвязного списка без использования классов. Определите структуру, содержащую указатель на структуру того же типа и поле данных (может быть просто целым числом).

Создайте примерно три переменные этой структуры и свяжите их вместе, чтобы первая указывала на вторую, вторая указывала на третью, а третья указывала на NULL (по которой вы можете определить конец списка).

Затем продемонстрируйте итерацию по списку. Очень распространенная идиома в C такова:

for (ptr = &first; ptr; ptr = ptr->next)
{
printf("%p %d\n", ptr, ptr->data);
}

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

Когда вы довольны этим, непременно оберните его в класс и добавьте методы, такие как push_back () и push_front (), и перегрузите некоторые операторы.

Но сначала убедитесь, что вы хорошо разбираетесь в основах.

1

Другие решения

Что это Node::next(Node *p) функцию делать?
Если это устанавливает следующее поле this в p, то этот код в вашем push_front функция, вероятно, неверна:

else
{
_head ->next(p);
_head = p;
}

Вместо этого следует:

  1. задавать p.next в _head, (голова сейчас следует p)
  2. задавать _head в p, (новая голова p)
0

По вопросам рекламы [email protected]