Получение ошибки сегментации при попытке передать узел - PullRequest
3 голосов
/ 22 июня 2019

Я новичок в C, и я только начал изучать, как использовать указатели.Я пытаюсь создать функцию (r), которая добавляет к bst в зависимости от того, больше ли параметр (int n), чем значение корневых узлов.Тем не менее, я продолжаю получать ошибки сегментации (ядро сбрасывается) после запуска следующего кода.Как это исправить, чтобы он мог нормально работать без ошибок.

struct node  {
    int data;
    struct node *left;
    struct node *right;
    }node;

struct node* newNode(int data){
    struct node* node = (struct node*)malloc(sizeof(struct node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return (node);
    }

void r (int n, struct node* root);

int main() {

    struct node *root = newNode(1);
    printf("%d", root->data);
    r(10, root);
    return 0;
    }

void r(int n, struct node* root){
    if(n > root->left->data){
       root->right = newNode(n);
       printf("New right is: %d\n", root->right->data);
    }
    else if(n < root->left->data){
       int a = root->left->data;
       root->left->data = n;
       root->right->data = a;
       printf("New left is: %d\n", root->left->data);

    }

       return;
    }

1 Ответ

4 голосов
/ 22 июня 2019

В функции r вы написали:

root->left->data

Но root->left равно NULL. Это вызовет ошибку по умолчанию, поскольку вы не можете разыменовать нулевой указатель.

Вы можете проверить правильность, выполнив что-то вроде:

// Make sure the left node exists, then do the test after
if (root->left && root->left->data > n)

, поскольку выполнение root->left заставит его проверить, что оно ненулевое (имеется в виду не NULL).

...