Ошибка сегментации при добавлении узла бинарного дерева - 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);
}
Объяснение кода листинга программы
- В функции
addnodeмы имеем два указателя:rootиv. Значениеrootуказывает на корень дерева, а значениеv- на значение, которое мы хотим добавить в дерево. - Если
rootравен NULL, то мы выделяем память под новый узел и присваиваемrootзначение этого нового узла. Значениеvприсваивается полюvнового узла. - Если
rootне равен NULL, то мы проверяем значениеvи сравниваем его с значением в полеvтекущего узла. - Если
vменьше значения в полеvтекущего узла, то мы рекурсивно вызываемaddnodeдля левого поддерева (полеleftтекущего узла). - Если
vбольше или равно значению в полеvтекущего узла, то мы рекурсивно вызываемaddnodeдля правого поддерева (полеrightтекущего узла).