Ошибка сегментации при добавлении узла бинарного дерева - C (СИ)

Узнай цену своей работы

Формулировка задачи:

делал реализацию добавления узла в бинарное дерево, но ловлю сегфолт, почему ? что здесь не так? изменяем же по указателю
#include <stdio.h>
#include <stdlib.h>
 
struct node
{
    int v;
    struct node* right;
    struct node* left;
};
 
void addnode(struct node* root, int v);
 
int main()
{
    struct node* root = NULL;
    addnode(root, 5);
    printf("%d\n", root->v);
    return 0;
}
 
void addnode(struct node* root, int v)
{
    if(root == NULL)
    {
        root = (struct node*)malloc(sizeof(struct node));
        root->v = v;
    }
    else
    {
        if(v < root->v)
        {
            addnode(root->left, v);
        }
        else
        {
            addnode(root->right, v);
        }
    }
}
если сделать через возврат указателя, всё работает
#include <stdio.h>
#include <stdlib.h>
 
struct node
{
    int v;
    struct node* right;
    struct node* left;
};
 
struct node* addnode(struct node* root, int v);
 
int main()
{
    struct node* root = NULL;
    root = addnode(root, 5);
    printf("%d", root->v);
    return 0;
}
 
struct node* addnode(struct node* root, int v)
{
    if(root == NULL)
    {
        root = (struct node*)malloc(sizeof(struct node));
        root->v = v;
    }
    else
    {
        if(v < root->v)
        {
            root->left = addnode(root->left, v);
        }
        else
        {
            root->right = addnode(root->right, v);
        }
    }
    return root;
}

Решение задачи: «Ошибка сегментации при добавлении узла бинарного дерева»

textual
Листинг программы
void addnode(struct node** root, int v)
{
    if(!*root)
    {
        *root = (struct node*)malloc(sizeof(struct node));
        *root->v = v;
    }
    else
        if(v < *root->v)
           addnode(&root->left, v);
        else
           addnode(&root->right, v);
}

Объяснение кода листинга программы

  1. В функции addnode мы имеем два указателя: root и v. Значение root указывает на корень дерева, а значение v - на значение, которое мы хотим добавить в дерево.
  2. Если root равен NULL, то мы выделяем память под новый узел и присваиваем root значение этого нового узла. Значение v присваивается полю v нового узла.
  3. Если root не равен NULL, то мы проверяем значение v и сравниваем его с значением в поле v текущего узла.
  4. Если v меньше значения в поле v текущего узла, то мы рекурсивно вызываем addnode для левого поддерева (поле left текущего узла).
  5. Если v больше или равно значению в поле v текущего узла, то мы рекурсивно вызываем addnode для правого поддерева (поле right текущего узла).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы