Ошибка сегментации (дамп ядра) с C ++ на Ubuntu

0

Я реализовал красное черное дерево, но когда я запускаю программу с терминала, она дает ошибку: ядро отказа от сегментации. Я думаю, что я получаю доступ к местоположению, к которому я не должен обращаться, или я получаю доступ к чему-то нулевому.

Это мой метод вставки:

template <class Item, class Key>
void RedBlackTree<Item, Key>::Insert(RedBlackTree<Item,Key> Tree, Node<Item, Key> *z)
{
    Node <Item, Key> *T=0;
    Node<Item, Key>* nill=T->nill;
    Node<Item, Key>* root=T->root;
    Node<Item, Key> *y;
    Node<Item, Key> *x;

    y=nill;
    x=root;
    //x= T->getRoot();

    while(x != nill)
    {
        y=x;
         if(z->getKey() < x->getKey())
             x= x->getLeft();
         else
             x = x->getRight();
    }

    z->setParent(y);

    if(y == nill)
        z=T->root;
    else
    if((z->getKey())<(y->getKey()))
    {
        y->setLeft(z);
    }
    else
    {
        y->setRight(z);
    }
        z->setLeft(nill);
        z->setRight(nill);
        z->colour1 = 'R';
        FixingInsert(Tree,z);
}

Это часть моей основной:

Node<int, int> q = Node<int, int>(0,5);

RedBlackTree<int, int> tree1;


    tree1.Insert(tree1, &q);

Может ли кто-нибудь помочь? Я новичок в шаблонах, и я был бы очень признателен, если кто-то мне поможет.

Заранее спасибо.

  • 1
    Я бы скомпилировал / запустил с опциями отладки, чтобы вы могли видеть трассировку стека и лучше отслеживать исключение.
  • 0
    ты знаешь GDB?
Показать ещё 3 комментария
Теги:

1 ответ

4

Вы разыскиваете NULL-указатель (дважды!):

Node <Item, Key> *T=0;
Node<Item, Key>* nill=T->nill;
Node<Item, Key>* root=T->root;

У меня такое чувство, что вы хотели написать:

RedBlackTree <Item, Key> *T= &Tree;
Node<Item, Key>* nill=T->nill;
Node<Item, Key>* root=T->root;

или

RedBlackTree <Item, Key> *T= this;
Node<Item, Key>* nill=T->nill;
Node<Item, Key>* root=T->root;

Хотя оба будут избыточными, потому что у вас уже есть указатель в this (но вы можете получить доступ к переменным-членам напрямую), и у вас уже есть объект Tree, члены которого вы можете получить через Tree. , (пока они public).

Также почему вы передаете экземпляр объекта самому методу? Это совершенно не нужно. Даже ссылка будет излишней.

Вероятно, вы должны удалить параметр Tree, удалить строку Node <Item, Key> *T=0; и удалить все T->.

  • 0
    Я пытался использовать: Node <Item, Key> T = & Tree; но выдает ошибку: не удается преобразовать RedBlackTree <int, int> в Node <int, int> * при инициализации
  • 0
    @ user3136756 Ах, извините, я исправил свой ответ.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню