Ошибка конфликтующих типов C без фактического наличия конфликтующих типов?

#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 , и т.д.