Ошибка сегментации (дамп ядра) в C ++ при попытке реализовать BST - PullRequest
0 голосов
/ 20 марта 2019

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

Теперь я получаю ошибку

Ошибка сегментации (сброшено ядро)

из этого кода (логика может быть неверной, так как это работав процессе)

#include <iostream>
using namespace std;

struct Node
{
    int data;
    Node *left, *right;
    Node(int data)
    {
        this->data = data;
        left = right = NULL;
    }
};
void traverseIn(Node *node, int val);

int main()
{
    int numOfNodes;
    cout << "number of nodes ";
    cin >> numOfNodes;

    for(int i = 0;i<numOfNodes;i++){
        struct Node *root;
        int data;
        cout << "data ";
        cin >> data;
        root->data = data;
        traverseIn(root,data);
    }
}

void traverseIn(Node *node , int val){
    if (node == NULL){
        node->data = val;
        return;
    }

     //go leftdat
     if (val <= node->data) {
        cout << "\nleft " << val<<" "<< node->data;
        traverseIn(node->left,val);
     }
     else if(val > node->data){
         //go right
        cout << "\nright " << val<<" "<< node->data;
        traverseIn(node->right,val);
     }

     cout << node->data << " ";

}

пример вывода

количество узлов 5

данные 12

слева 12 12

Ошибка сегментации (ядро сброшено)

Что я хочу знать, это

1) как я могу отладить эту ошибку, как я часто сталкиваюсь с ней.Я использую VS Code в Ubuntu, используя компилятор по умолчанию, который он поставлял, и расширения C / C ++ от Microsoft, но когда я присоединяю точку останова, я получаю только стек вызовов.Как я могу настроить его так, чтобы я мог шагать по нему, как если бы я был Java-программой.

2) Как я могу заставить C ++ распечатывать значимые сообщения об ошибках, а не просто сегментировать сообщение об ошибке.Например, я хотел бы знать, какая строка в программе является ошибкой (хотя это очевидно в этом примере).

3) Как я могу исправить эту ошибку.

Я прочитал xkcd meme и Что такое ошибка сегментации?

1 Ответ

1 голос
/ 22 марта 2019

root не определено. Ваш код вызывает разыменование неопределенного указателя. Вы можете попробовать свой код здесь живой тест

=========== Начало сообщения о времени выполнения # 0 stensal ===========

Ошибка времени выполнения: [разыменование неопределенного указателя]
Продолжение выполнения может привести к неопределенному поведению, прервать!

-
- Writing 4 bytes to an undefined address (0x0).
- 
- Stack trace (most recent call first) of the write.
- [1]  file:/prog.cc::27, 9
- [2]  [libc-start-main]
-

============ Конечное сообщение об окончании # 0 ===========

Простое исправление (только для исправления ошибки, но не логики вашего кода)

root = new Node(data);
...