#c #pointers #segmentation-fault #iteration #binary-search-tree
#c #указатели #сегментация-неисправность #итерации #двоичный поиск-дерево
Вопрос:
У меня есть онлайн-задание по программированию для моего класса, и я пытался найти решение для задачи, которая гласит:
Вы должны создать функцию, которая вставляет новый (инт ) данные итеративно по британскому летнему времени. Первый параметр, он получает указатель на корень по британскому летнему времени, то выражение (int ) данные, которые вы должны вставить. Части дерева выглядят следующим образом:
typedef struct _node
{
int data;
struct _node* left;
struct _node* right;
} node;
В дереве вы всегда находите меньшие значения слева и большие значения справа. Ни одно из значений не дублируются,
Так что функция не должна вставить значение, которое уже часть по британскому летнему времени
//My function that I've been working on looks like this:
node* newNode(int key)
{
node* uj = calloc(1, sizeof(node));
if (uj != NULL)
{
uj->data = key;
uj->left = uj->right = NULL;
}
return uj;
}
void insert(node* root, int key)
{
node* curr = root;
node* parent = NULL;
if (root == NULL)
{
root = newNode(key);
return;
}
while (curr != NULL)
{
parent = curr;
if (key == curr->data)
return;
if (key < curr->data)
curr = curr->left;
if (key > curr->data)
curr = curr->right;
}
if (key < parent->data)
parent->left = newNode(key);
else
parent->right = newNode(key);
}
Я думаю, что это должно работать просто отлично, так как на самом деле это курс «основы программирования 1» на электротехническом факультете.
Я видел похожие вопросы с хорошими ответами, но поскольку эта строка существует в описании задачи
- Так что функция не должна вставить значение, которое уже часть по британскому летнему времени
Я был не в состоянии завершить свое задание, ведь в онлайн-компилятор, или тестер говорит, что это :изображение ошибки худшая часть заключается в том, что я мало старается, и если я не я не сможем пройти этот курс..
Спасибо для вашего времени, если вы decite, чтобы помочь мне решить эту задачу!
Комментарии:
1. Вы уверены, что нулевой указатель может быть передан в? Ведь,
root = newNode(key);
действительно, нет смысла здесь, так как это только изменение локальнойroot
переменной и недавно выделенный узел будет вне досягаемости для вызывающего кода?2. То есть, я не знаю ограничений «тестера», но как есть, если вы рассчитываете вставить функцию, чтобы также быть в состоянии изменить в корне дерева, вам придется либо сделать его возвращает корневой узел, изменение подписи, чтобы
node *insert(node *root, int key)
передать или адрес корень, чтобы вставить функцию, изменив подписьvoid insert(node **root, int key);
3.«Я думаю, что это должно работать просто отлично» — это не так.
root = newNode(key);
значит, ничего не вызывающему этой функции (который не показан здесь). Все, что линии делает, это изменить значениеroot
внутри функции, где это автоматическая переменная. он не изменяет переменную (если таковые имеются) принят абонента частьinsert
. Если спецификации именно так, как описаноvoid insert(node *root, int key)
, то, чего они просят невозможного , если абонентыroot
заполняется заранее, до того, как вызов функции. И мы не имеем никакой возможности узнать что либо.