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