Ошибка сегментации при добавлении узла бинарного дерева - 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
текущего узла).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д