#c #binary-search-tree
#c #binary-search-tree
Вопрос:
Итак, я объявил функцию в файле .h и для этого я просто скопировал и вставил объявление функции и добавил точку с запятой, чтобы я не видел, откуда берется ошибка.
Источник:
struct node* remove(struct node* node, int key)
{
if(search(root,removeMe)!=NULL){
struct node* temp=search(root,removeMe);
if(temp->left==NULL amp;amp; temp->right==NULL)
{
temp=NULL;
return node;
}
}
return node;
}
Заголовок:
#ifndef PROJECT2_BST_H
#define PROJECT2_BST_H typedef struct node {
int key;
struct node* left;
struct node* right; }; struct node* insert(struct node* node, int key); void inorder(struct node *root);
//void quit(struct node *root); struct node* search(struct node* root,
int key); struct node* remove(struct node* node, int key);
#endif //PROJECT2_IO_H }
Комментарии:
1. При отформатированном заголовке, как показано, заголовок вообще не должен компилироваться. Пожалуйста, убедитесь, что код, который вы показываете, соответствует тому, что у вас действительно есть в вашем заголовке. Я могу догадаться, но я бы, вероятно, ошибся.
2. Этот код заголовка выглядит так, как будто он был брошен в blender. Вы можете это исправить?
3. Стоит отметить, что ваша
remove()
функция фактически не удаляет объекты из связанного списка, вы просто меняете локальную переменную, которая является копией указателя, и если бы это произошло, это привело бы к утечке памяти. Он также предполагает, чтоtemp
это допустимый указатель, и продолжает разыменовывать его без предварительной проверки, что является неопределенным поведением, которое должноsearch
возвращать противоречивые результаты или находиться в потоковом коде.4. Вы также выполняете
search
дважды, один раз отбрасывая результаты, во второй раз фиксируя их. Вы должны выполнить поиск один раз и зафиксировать его.
Ответ №1:
Ваша проблема в том, что remove
это стандартная библиотечная функция, обычно определяемая stdio.h
как
int remove (const char *__filename)
Поэтому я предлагаю вам изменить имя вашей функции. Возможно, в этом случае вы могли бы добавить префикс, например, node_
к каждому из имен ваших функций, чтобы предотвратить коллизии имен; так node_remove
, node_insert
, и т.д.