Двоичное дерево не скомпилируется: ошибка «WinMain @ 16»

0

Я занимаюсь созданием двоичного дерева с помощью связанного списка, ниже у меня есть класс funtree:

template <typename T>
class funtree
{
private:
struct Node
{
    T data;
    Node *left;
    Node *right;
};
Node* GetNewNode(T data)
{
    Node* newNode = new Node();
    newNode->data = data;
    newNode->left = newNode->right = NULL;
    return newNode;

}
Node* Insert(Node* root, T data)
{
    if(root == NULL) //empty tree
    {
        root = GetNewNode(data);
        return root;
    }
    else if(data <= root->data)
    {
        root->left = Insert(root->left, data);
    }
    else
    {
        root->right = Insert(root->left, data);
    }
    return root;
}
bool Search(Node* root, int data)
{
   if(root == NULL)
        return false;
   else if (root->data == data)
    return true;
   else if (data <= root->data)
    return Search(root->left, data);
   else
    return Search(root->right, data);

и мой основной метод:

 T main()
{
    Node* root; // pointer to root node
    root = NULL; // setting tree as empty
    Insert(root,15);
    Insert(root,10);
    Insert(root,20);
    T num;
    cout<<"Enter number to be searched\n";
    cin>>num;
    if(Search(root, num) == true)
        cout<<"Found\n";
    else
        cout<<"Not Found\n";
}

Я пытаюсь проверить свой метод поиска, чтобы узнать, работает ли он, и когда я пытаюсь скомпилировать, я получаю только ошибку:

main.c||undefined reference to 'WinMain@16'|

Программа также является консольным приложением, и они оба находятся в одном классе, я не думаю, что это проблемы, но на всякий случай это нужно знать.

РЕДАКТИРОВАТЬ:

Я изменил некоторые части кода, но вставлю его, как он выглядит в моем компиляторе, вместо того, чтобы разделять основную функцию и класс:

#include <iostream>

using namespace std;

template <typename T>
class funtree
{
private:
struct Node
{
    T data;
    Node *left;
    Node *right;
};
Node* GetNewNode(T data)
{
    Node* newNode = new Node();
    newNode->data = data;
    newNode->left = newNode->right = NULL;
    return newNode;

}
Node* Insert(Node* root, T data)
{
    if(root == NULL) //empty tree
    {
        root = GetNewNode(data);
        return root;
    }
    else if(data <= root->data)
    {
        root->left = Insert(root->left, data);
    }
    else
    {
        root->right = Insert(root->left, data);
    }
    return root;
}
bool Search(Node* root, int data)
{
   if(root == NULL)
        return false;
   else if (root->data == data)
    return true;
   else if (data <= root->data)
    return Search(root->left, data);
   else
    return Search(root->right, data);

}

  int main()
    {
    Node* root; // pointer to root node
    root = NULL; // setting tree as empty
    Insert(root,15);
    Insert(root,10);
    Insert(root,20);
    T number;
    cout<<"Enter number to be searched\n";
    cin>>number;
    if(Search(root, number) == true)
        cout<<"Found\n";
    else
        cout<<"Not Found\n";
    }
  • 1
    Я думаю, что это должно быть int main (), а не T main ()
  • 0
    @michaeltang хорошо, мой класс funtree использует шаблон, так что мой основной метод должен следовать этому?
Показать ещё 2 комментария
Теги:
linked-list
compiler-errors
binary-tree
codeblocks

3 ответа

0
Лучший ответ

в вашем коде есть много проблем, надеюсь, что этот кусок кода поможет

prob1: declear struct Узел как закрытый, но попытка доступа к нему в основном

prob2: root * при изменении параметра при новом узле, но вы не вернули новый корень. либо определите Insert как Node* Insert(Node*& root, T data) либо назначьте возвращаемое значение функции root.

prob3: main всегда должен возвращать int

#include <iostream>
using namespace std;
template <typename T>
class funtree
{
public:
struct Node
{
    T data;
    Node *left;
    Node *right;
};
Node* GetNewNode(T data)
{
    Node* newNode = new Node();
    newNode->data = data;
    newNode->left = newNode->right = NULL;
    return newNode;

}
Node* Insert(Node* root, T data)
{
    if(root == NULL) //empty tree
    {
        root = GetNewNode(data);
        return root;
    }
    else if(data <= root->data)
    {
        root->left = Insert(root->left, data);
    }
    else
    {
        root->right = Insert(root->left, data);
    }
    return root;
}
bool Search(Node* root, int data)
{
   if(root == NULL)
        return false;
   else if (root->data == data)
    return true;
   else if (data <= root->data)
    return Search(root->left, data);
   else
    return Search(root->right, data);
}
};
int main()
{
    funtree<int> tree;
    funtree<int>::Node* root; // pointer to root node
    root = NULL; // setting tree as empty
    root = tree.Insert(root,15);
    root = tree.Insert(root,10);
    root = tree.Insert(root,20);
    int num;
    cout<<"Enter number to be seared\n";
    cin>>num;
    cout<<num;
    if(tree.Search(root, num) == true)
        cout<<"Found\n";
    else
        cout<<"Not Found\n";
    return 0;
}
  • 0
    когда я делаю эти изменения, я получаю точно такую же ошибку, вы думаете, что это просто ошибка компилятора?
  • 0
    @ user3358064, вы пытаетесь создать приложение для Windows? если да, может быть, вы должны изменить его на консольное приложение
Показать ещё 5 комментариев
0

измените T main() на int main()... это должно удалить ошибку.... main() всегда возвращает int...

  • 0
    в комментариях я обнаружил ошибку, в которой говорится, что C:\Users\Admin\Desktop\CSProjects\treefun\main.cpp||In member function int funtree<T>::main()':|
  • 0
    main () - глобальная функция, а не часть вашего класса. Объявите ее как глобальную и измените свой код соответствующим образом ...
0

Кажется, вы помещаете свой основной метод в класс шаблона. Это не сработает. Вам нужна ваша основная функция, не являющаяся членом. Он возвращает int и обычно либо:

int main();

или

int main(int argc, char* argv[]);

Возможно, вам придется изменить свою компиляцию также потому, что когда компоновщик ожидает, что WinMain обычно указывает, что он создает программу GUI. Но ваш код выглядит как консольная программа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню