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

Код вставки узла вызывает ошибку сегментации. Этот код вызывает ошибку сегментации, когда я пытаюсь распечатать данные, хранящиеся в корневом узле.

Ниже приведена реализация программы вставки для дерева двоичного поиска. Эта программа использует рекурсию для вставки данного узла.

#include <stdio.h>
#include <stdlib.h>

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

struct node *make (int);
struct node *insert (struct node *, int);

void
main ()
{
  struct node *root;
  root = NULL;

  insert (root, 2);
  insert (root, 3);
  insert (root, 4);
  insert (root, 5);
  insert (root, 6);
  insert (root, 7);
  printf ("%d", root->data);
}

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

struct node *
insert (struct node *root, int x)
{
  if (root == NULL)
  {
    root = make (x);
  }
  else
  {
    if (x <= root->data)
    {
      root->left = insert (root->left, x);
    }
    else if (x > root->data)
    {
      root->right = insert (root->right, x);
    }
  }
  return root;
}   

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Проблема в том, что вы не назначаете возвращенное значение функции insert для корня узла.

Запись

root = insert (root, 2);

// ...

Другая проблема состоит в том, что вы неправильно распределяете память

temp = (struct node *) malloc (sizeof (struct node *));
                                       ^^^^^^^^^^^^^

Должно быть

temp = (struct node *) malloc (sizeof (struct node ));
                                       ^^^^^^^^^^^^^

Также внутри функции вставьте внутренний, еслиоператор должен выглядеть следующим образом:

if (x < root->data)
{
    root->left = insert (root->left, x);
}
else
{
    root->right = insert (root->right, x);
}

Обратите внимание, что согласно стандарту C функция main без параметров должна быть объявлена ​​как

int main( void )
0 голосов
/ 02 октября 2019

Не игнорируйте возвращаемое значение insert:

void main(){
  struct node* root;
  root = NULL;

  root = insert(root,2);
  insert(root,3);
  insert(root,4);
  insert(root,5);
  insert(root,6);
  insert(root,7);

  printf("%d",root->data);
}

Другие моменты, которые вы можете рассмотреть:

  • Я не могу рекомендовать использовать void main(): в основном потому, чтоэто нестандартно. Используйте int main(void) и возвращайте 0.
  • Используйте printf("%p", root); для проверки: если значение 0x0, ваш указатель равен NULL.
  • При выполнении выделения памяти в подфункции, вы всегда должны проверять, было ли выделение выполнено успешно.
struct node *
make (int x)
{
  struct node *temp;
  if ((temp = (struct node *) malloc (sizeof (struct node))) == NULL)
      return (NULL);
  temp->data = x;
  temp->left = NULL;
  temp->right = NULL;
  return temp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...