Я сделал это в чистом C, но теперь я пытаюсь реализовать двоичное дерево поиска в C++. Большая часть кода такая же, но вместо malloc()
я хочу использовать new
оператор. Однако я получаю эту ошибку:
Undefined symbols for architecture x86_64:
"operator new(unsigned long)", referenced from:
GetNewNode(int) in BstTreeV3-beb469.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Это мой код на идеоне. Нажмите здесь, чтобы просмотреть его.
Node* GetNewNode(int data) {
Node *newNode = new Node();
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
void Insert(Node **root, int data)
{
if (*root == NULL) { // empty tree
*root = GetNewNode(data);
}
else if ((*root)->data < data) {
Insert(&((*root)->left), data);
}
else {
Insert(&((*root)->right), data);
}
}
Я понимаю, что это не лучший способ реализации, но я просто практикую. Если у вас есть рекомендации по реализации BST, пожалуйста, не стесняйтесь комментировать.
Чтобы программа имела какой-то смысл, она должна быть такой:
class Node
{
private:
int data;
Node* left;
Node* right;
public:
Node()
:data(0), left(NULL), right(NULL)
{}
Node(int d)
:data(d), left(NULL), right(NULL)
{}
};
...
*root = new Node(data);
Если вы не используете эти языковые функции, вы можете также придерживаться C.
Хотя кажется весьма вероятным, что конкретная ошибка, которую вы получили, связана с компиляцией кода C++ с компилятором C, как указано в комментариях к вашему вопросу.
new
(и, надеюсь,delete
), значит, вы не программируете на C, поэтому я удалил этот тег. И это, вероятно, причина того, что ваше соединение перестало работать, потому что выclang
с помощьюclang
который не связывается с библиотекой времени выполнения C ++, вам следует вместо этого строить с помощьюclang++
, который автоматически связывается с библиотекой времени исполнения C ++ (или вручную связывается с библиотекой времени исполнения C ++) ,