список остается пустым даже после вставки элемента C ++ - PullRequest
0 голосов
/ 18 октября 2011

Я пытаюсь вставить указатели в список, но каждый раз, когда я пытаюсь напечатать список, или проверить, что в списке, он говорит, что он пуст.Это означает, что моя вставка неверна, но я не понимаю почему, мои следующие классы:

namespace {

  template <typename T>
  pair < node<T>*, bool> addElement (const T& elem, btree<T>* bt) {

     class list < node<T>* >::iterator itr = bt->level().begin();

     if (bt->level().empty()) {
      node <T>*n = new node<T>(elem, bt->max());
      cout << n->getItem() << endl;
      bt->addElem(itr, n);
      return make_pair(n, true);
     }

     for (; itr != bt->level().end(); ++itr) {
        if (elem < (*itr)->getItem()) {
          node <T>* n = new node<T> (elem, bt->max());
          (*itr)->previous()->addNext(n);
          n->addPrev((*itr)->previous());
          n->addNext(*itr);
          (*itr)->addPrev(n);
          bt->addElem(itr, n);
          return make_pair(n, true);
            } else if (elem == (*itr)->getItem()) return make_pair(*itr, false); 
          }

     // other stuff + return statement

}

addElem выполняет следующее:

void addElem (std::_List_iterator<node<T>*>& itr, node <T>* n) { 
  neighbours.insert(itr, n); 
  if (neighbours.empty()) cout << "wa?";
}

, где btree класс состоитиз:

size_t maxNodeElems;
list < node<T>*> neighbours;

другие вещи, такие как addPrev() и previous(), являются просто геттерами и сеттерами.В любом случае, я запустил тестовый файл, который в значительной степени создает btree, и вызывает функцию insert, которая напрямую вызывает эту функцию addElement.Но всякий раз, когда я пытаюсь распечатать список внутри btree, он говорит, что он пуст и ошибки seg.Я не понимаю, почему он не хранится.

Любая помощь будет признательна!

ПРИМЕЧАНИЕ: "Ва?"продолжает печатать

1 Ответ

0 голосов
/ 18 октября 2011

Кажется, вы пытаетесь сохранить отсортированный список, поэтому у вас есть:

// find the place to insert elem
for (; itr != bt->level().end(); ++itr) {
    if (elem < (*itr)->getItem()) {
        // insert...
    }
}

Но если список пуст (начальное состояние), itr, вероятно, будет в первую очередь равен bt-> level (). End (), поэтому вы никогда ничего не вставите ...

Вам также следует учитывать случай, когда вы пытаетесь вставить элемент, для которого (elem <(* itr) -> getItem ()) всегда false (новый наибольший элемент в списке). Вы должны также разобраться с этим делом.

...