Двоичное дерево производят дефект сегментации - PullRequest
1 голос
/ 27 сентября 2019

Я новичок в C и хочу начать с написания простого двоичного дерева.Есть проблемы как в функциях push, так и traverse, но я уже два дня разбираюсь с программой.Когда я компилирую и выполняю программу, это показывает ошибку сегментации.Код приведен ниже, и любая помощь будет принята с благодарностью.Спасибо

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

typedef struct Node
{
  struct Node* right;
  struct Node* left;
  int* value;
} Node;

Node* init()
{
  Node* t = (Node*) malloc(sizeof(Node));
  t->left = NULL;
  t->right = NULL;
  t->value = NULL;
  return t;
}

int traverse(Node* tree)
{
  printf("value : %d\n", *(tree->value));
  if (tree->left != NULL) {
    traverse(tree->left);
  } else if (tree->right != NULL){
    traverse(tree->right);
  }
}

void push(Node* n, int val)
{
  if (n->value == NULL)
  {
    *(n->value) = val;
  } else if (n->left == NULL && val < *(n->value)) {
    n->left = init();
    push(n->left, val);
  } else if (n->right == NULL && val > *(n->value)) {
    n->right = init();
    push(n->right, val);
  }
} 

int main(int argc, char const *argv[])
{
  srand(time(NULL));
  Node* tree = init();

  for (unsigned int i = 0; i < 20; ++i)
  {
    int val = rand() % 10;
    push(tree, val);
    printf("%d\n", val);
  }

  traverse(tree);
  printf("%s\n", "End Of Program!");
  return 0;
}

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Вы никогда не выделяете место для значения.Измените определение на целое число.

typedef struct Node
{
  struct Node* right;
  struct Node* left;
  int value;
} Node;

, а затем

n->value = val;

и

printf("value : %d\n", tree->value);
1 голос
/ 27 сентября 2019

Члену value типа Node никогда не присваивается значение, отличное от NULL.Поскольку его значение является нулевым указателем, использование оператора *(n->value) = val; является неправильным;он пытается разыменовать нулевой указатель.

Если вы хотите, чтобы value указывал на int, вы должны выделить память для int и установить value на адрес этой памяти.Если вы хотите, чтобы value был int, вы должны изменить его объявление и код, который его использует.

...