2017-04-13 140 views
0

我不知道我是否鏈接錯誤,但我正在編譯這個在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; 
} 

對我來說,鏈接文件沒有任何問題。

一些例子:未定義參考節點:: getnum()

未定義參考節點::的getName()

回答

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 
+0

非常感謝,我檢查了我的makefile,並且我編譯了bst兩次。我很抱歉你的時間大聲笑。 – cout