大量未定义的参考错误

时间:2017-04-13 23:53:06

标签: c++ binary-search-tree nodes

我不知道我是否链接错误,但我正在linux上编译它,我得到了很多未定义的节点函数引用。我正在编写一个二叉搜索树来搜索即将到期的课程电话。

bst.cpp

#include "bst.hpp"


BST::BST(void)
{
    count = 0;
    root = NULL;
}

void BST::insert(long long x, string y)
{
    Node *newnode = new Node(x, y);
    Node *temp;

if (count == 0)
{
    root = newnode;
    count++;
}
else
{
while(temp->getleft() != NULL && temp->getright() != NULL)
{
if(newnode->getnum() < temp->getnum())
{ 
    temp = temp->getleft();
}
else
{
    temp = temp->getright();
}
}
if (newnode->getnum() < temp->getnum())
{
    temp->setleft(newnode);
}
else
{
    temp->setright(newnode);
}
}
}

Node * BST::getroot(void)
{
    return root;
}

Node* BST::delete_node(Node  *troot, long long key)
{
if (count == 0)
{
    return troot;
}
else if(key < troot->getnum())
{
    delete_node(troot->getleft(), key);
}
else if (key > troot->getnum())
{
    delete_node(troot->getright(), key);
}
else
{
if(troot->getleft() == NULL && troot->getright() == NULL)
{
    delete troot;
    troot == NULL;
}
else if(troot->getright() == NULL)
{
    Node *temp = troot;
    troot = troot->getleft();
    delete temp;
}
else if(troot->getleft() == NULL)
{
    Node *temp = troot;
    troot = troot->getright();
    delete temp;
}
}
    return troot;
}

void BST::preverse(Node* troot)
{
if(root == NULL)
{
    cout << "The tree is empty\n";
}
if(troot == NULL)
{
    return;
}

cout << troot->getname() << endl;
cout << troot->getnum() << endl;
preverse(troot->getleft());
preverse(troot->getright());    
}

void BST::postverse(Node* troot)
{
if(root == NULL)
{
    cout << "The tree is empty\n";
}
if(troot == NULL)
{
    return;
}

postverse(troot->getleft());
postverse(troot->getright());
cout << troot->getname() << endl;
cout << troot->getnum() << endl;
}

void BST::inverse(Node* troot)
{
if(root == NULL)
{
    cout << "The tree is empty\n";
}
if(troot == NULL)
{
    return;
}

inverse(troot->getleft());
cout << troot->getname() << endl;
cout << troot->getnum() << endl;
inverse(troot->getright()); 
}

void BST::search(Node* troot, long long key)
{
if(root == NULL)
{
    cout << "The tree is empty\n";
}
if(troot == NULL)
{
    return;
}
if(key == troot->getnum())
{
    cout << troot->getname();
}   
search(troot->getleft(), key);
search(troot->getright(), key); 
}

bst.hpp

#include "node.hpp"
#ifndef bst_hpp
#define bst_hpp

class BST
{
    Node* root;
    long long count;
public:
    BST(void);

    void insert(long long x, string y);

    Node* getroot(void);

    Node* delete_node(Node* troot, long long key);

    void preverse(Node* troot);

    void postverse(Node* troot);

    void inverse(Node* troot);

    void search(Node* troot, long long key);
};

#endif

node.cpp

#include "node.hpp"

Node::Node(void)
{
    number = 0;
    name = "no name";
    left = NULL;
    right = NULL;
}

Node::Node(long long t, string n)
{
    number = t;
    name = n;
    left = NULL;
    right = NULL;
}

Node * Node::getleft(void)
{
    return left;
}

Node * Node::getright(void)
{
    return right;
}

void Node::setleft(Node * ptr)
{
    left = ptr;
}

void Node::setright(Node * ptr)
{
    right = ptr;
}

long long Node::getnum(void)
{
    return number;
}

string Node::getname(void)
{
    return name;
}

node.hpp

#ifndef node_hpp
#define node_hpp
#include <string>
#include <iostream>
using namespace std;

class Node
{
    long long number;
    string name;
    Node *left;
    Node *right;
public:
    Node(void);

    Node(long long t, string n);

    Node* getleft(void);

    Node* getright(void);

    void setleft(Node* ptr);

    void setright(Node* ptr);

    long long getnum(void);

    string getname(void);
};


#endif

的main.cpp

#include "bst.hpp"
using namespace std;

int main(void)
{
int choice;
long long numin;
string input;
BST phbook;

do
{
cout << "1. Insert a name and number.\n2. Delete using number.\n3. Traverse pre-order\n4. Traverse post-order\n";
cout << "5. Traverse in-order\n6. Search using number.\n6. Exit program\n";
switch(choice)
{
case 1:
    cout << "Enter a name\n";
    cin.ignore();
    getline(cin, input);
    cout << "Enter a number\n";
    cin >> numin;
    phbook.insert(numin, input);
    break;

case 2:
    cout << "Enter the phone number you'd like to delete.\n";
    cin >> numin;
    phbook.delete_node(phbook.getroot(), numin);
    break;

case 3:
    phbook.preverse(phbook.getroot());
    break;

case 4:
    phbook.postverse(phbook.getroot());
    break;

case 5:
    phbook.inverse(phbook.getroot());
    break;

case 6:
    cout << "Enter a phone number to search.\n";
    cin >> numin;
    phbook.search(phbook.getroot(),numin);
default:
    numin=numin;    
}
}while(choice >= 1 && choice <= 6);
return 0;
}

对我而言,链接文件没有任何错误。

一些例子:对Node :: getnum()的未定义引用

对Node :: getname()的未定义引用

1 个答案:

答案 0 :(得分:0)

检查编译元素的顺序:

g++ node.cpp -o node.o bst.cpp -o bst.o main.cpp -o main.o

结果:

./main.o

1. Insert a name and number.
2. Delete using number.
3. Traverse pre-order
4. Traverse post-order
5. Traverse in-order
6. Search using number.
6. Exit program