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

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

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

делал реализацию добавления узла в бинарное дерево, но ловлю сегфолт, почему ? что здесь не так? изменяем же по указателю
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct node
  4. {
  5. int v;
  6. struct node* right;
  7. struct node* left;
  8. };
  9. void addnode(struct node* root, int v);
  10. int main()
  11. {
  12. struct node* root = NULL;
  13. addnode(root, 5);
  14. printf("%d\n", root->v);
  15. return 0;
  16. }
  17. void addnode(struct node* root, int v)
  18. {
  19. if(root == NULL)
  20. {
  21. root = (struct node*)malloc(sizeof(struct node));
  22. root->v = v;
  23. }
  24. else
  25. {
  26. if(v < root->v)
  27. {
  28. addnode(root->left, v);
  29. }
  30. else
  31. {
  32. addnode(root->right, v);
  33. }
  34. }
  35. }
если сделать через возврат указателя, всё работает
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct node
  4. {
  5. int v;
  6. struct node* right;
  7. struct node* left;
  8. };
  9. struct node* addnode(struct node* root, int v);
  10. int main()
  11. {
  12. struct node* root = NULL;
  13. root = addnode(root, 5);
  14. printf("%d", root->v);
  15. return 0;
  16. }
  17. struct node* addnode(struct node* root, int v)
  18. {
  19. if(root == NULL)
  20. {
  21. root = (struct node*)malloc(sizeof(struct node));
  22. root->v = v;
  23. }
  24. else
  25. {
  26. if(v < root->v)
  27. {
  28. root->left = addnode(root->left, v);
  29. }
  30. else
  31. {
  32. root->right = addnode(root->right, v);
  33. }
  34. }
  35. return root;
  36. }

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

textual
Листинг программы
  1. void addnode(struct node** root, int v)
  2. {
  3.     if(!*root)
  4.     {
  5.         *root = (struct node*)malloc(sizeof(struct node));
  6.         *root->v = v;
  7.     }
  8.     else
  9.         if(v < *root->v)
  10.            addnode(&root->left, v);
  11.         else
  12.            addnode(&root->right, v);
  13. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы