Как уже указывалось, ваши методы createList
и inorderInsert
принимают список по значению, поэтому они копируют его, изменяют копию и ничего не делают с копией. Так что он разрушается и вся работа теряется. Ваше замечание о том, что оно также не работает в createList
напрямую, является спорным, поскольку createList
также принимает список по значению, поэтому он будет вставлен в локальный список (и вы можете проверить это с некоторыми выходными данными непосредственно в этом методе)но это не повлияет на список, с которым вы вызываете этот метод.
Вы должны либо передать список по ссылке, как показано здесь:
template <class elemType>
void bSearchTreeType<elemType>::createList(orderedLinkedList<elemType> &list)
{
inorderInsert(root, list);
}
template <class elemType>
void bSearchTreeType<elemType>::inorderInsert
(bNodeType<elemType> *p, orderedLinkedList<elemType> &list)
{
//...
}
(обратите внимание на &
), либо создать список в методе и вернуть его, как показано здесь:
template <class elemType>
orderedLinkedList<elemType> bSearchTreeType<elemType>::createList()
{
return inorderInsert(root);
}
template <class elemType>
orderedLinkedList<elemType> bSearchTreeType<elemType>::inorderInsert
(bNodeType<elemType> *p, orderedLinkedList<elemType> list, orderedLinkedList<elemType> list = {}) // Default parameter, so we don't have to do it in createList
{
orderedLinkedList<elemType> list
if (p != nullptr)
{
list = inorderInsert(p->lLink, list);
list.insertLast(p->info);
list = inorderInsert(p->rLink, list);
}
return list;
}
Лично я бы предпочел гибридное решение, где createList
генерирует его и возвращает, а inorderInsert
берет его по ссылке и модифицирует.