尝试编译二叉树程序时出错

Posted

技术标签:

【中文标题】尝试编译二叉树程序时出错【英文标题】:error when trying to compile binary tree program 【发布时间】:2014-04-02 10:08:33 【问题描述】:

所以在这个项目中,我必须开发一个二叉表达式树,并使用该树将后缀表达式转换为中缀表达式。大部分看起来都还不错,(除了我尚未完成的一两个功能)。但是我在尝试编译它时遇到了错误。唯一的问题是它并没有真正告诉我问题是什么。这是我尝试编译时遇到的问题:

g++ -o bet.x bet.cpp /usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../lib64/crt1.o:在函数“_start”中: (.text+0x20): 对 `main' 的未定义引用

collect2: ld 返回 1 个退出状态

make: *** [bet.x] 错误 1

我不知道这意味着什么。但只是以防万一这是我的 3 个文件。从我的 makefile 开始:

bet.x: bet.cpp
    g++ -o bet.x bet.cpp

clean:
    rm -f *.o *.x core.*

这是包含我的接口的 bet.h(头文件):

#include <string>

using namespace std;

struct BinaryNode

  string element;
  BinaryNode* leftNode;
  BinaryNode* rightNode;
;

class BET

public:
  BET();
  BET(const string postfix);
  BET(const BET&);
  ~BET();
  bool buildFromPostfix(const string postfix);
  const BET& operator= (const BET&);
  void printInfixExpression();
  void printPostfixExpression();
  size_t size();
  size_t leaf_nodes();
  bool empty();


private:

  void printInfixExpression(BinaryNode *n);
  void makeEmpty(BinaryNode* &t);
  BinaryNode* clone(BinaryNode* t) const;
  BinaryNode* headNode;
  void printPostfixExpression(BinaryNode *n);
  size_t size(BinaryNode *t);
  size_t leaf_nodes(BinaryNode *t);

;

向您展示包含我所有实现的整个 bet.cpp 文件可能太过分了。但这里有一些。如果需要更多,请发表评论:

BET::BET()

    headNode = NULL;


BET::BET(const string postfix)

    headNode = NULL;
    buildFromPostfix(postfix);


BET::BET(const BET& t)

    headNode = clone(t.headNode);


BET::~BET()

    makeEmpty(headNode);


//2 functions i made myself for high/low precedence 
bool isHighPrec(const string& op)

    return op == "*" || op == "/";


bool isLowPrec(const string& op)

    return op == "+" || op == "-";


//returns false for errors, returns true otherwise
bool BET::buildFromPostfix(const string postfix)

    stack<BinaryNode*> opTree;
    istringstream istr(postfix);
    string op;

    makeEmpty(headNode);

    while(istr >> op)
    
            if(isHighPrec(op) || isLowPrec(op))
            
                    if(opTree.size() < 2)
                    
                            cout << "Error -- invalid postfix expression!\n";
                            while(opTree.size())
                            
                                    makeEmpty(opTree.top());
                                    opTree.pop();
                            
                            return false;
                    
                    else
                    
                            BinaryNode* bn = new BinaryNode();

                            bn->element = op;
                            bn->rightNode = opTree.top();
                            opTree.pop();
                            bn->leftNode = opTree.top();
                            opTree.pop();

                            opTree.push(bn);
                    
            
            else
            
                    BinaryNode* bn = new BinaryNode();

                    bn->element = op;
                    bn->rightNode = NULL;
                    bn->leftNode = NULL;

                    opTree.push(bn);
            
    

    if(opTree.size() != 1)
    
            cout << "Error -- invalid postfix expression!\n";
            while(opTree.size())
            
                    makeEmpty(opTree.top());
                    opTree.pop();
            
            return false;
    
    else
    
            headNode = opTree.top();
            opTree.pop();
    
return true;


【问题讨论】:

你说唯一的问题是它并没有真正告诉我问题是什么。但那是无效的。您粘贴了确切的错误:(.text+0x20): undefined reference to 'main' -1 这可以通过简单的网络搜索来轻松解决您的错误消息。 What is an undefined reference/unresolved external symbol error and how do I fix it?的可能重复 【参考方案1】:

这意味着您正在尝试编译一个没有定义main 函数的可执行程序。 程序不知道先运行哪个函数。

要解决此问题,您需要在源代码的全局上下文中的某处添加 int main() //body return 0;

【讨论】:

谢谢。问题是我并不完全知道错误消息是什么,所以我只是尝试搜索整个消息并没有得到任何有用的结果。不过我想通了 正中目标。我搜索了很多答案,只有这一个给了我解决方案。缺少main() 函数。【参考方案2】:

以下命令:g++ -o bet.x bet.cpp 表示从单个文件中创建一个名为 bet.x 的可执行文件:bet.cpp

但是要生成可执行文件,您需要缺少一个 main() 函数。

如果你只是想确保语法没问题,你可以通过将-c 传递给 g++ 来构建一个目标文件

另一种选择是添加一个main() 函数,甚至可以编写一些测试来检查代码是否有效。

【讨论】:

以上是关于尝试编译二叉树程序时出错的主要内容,如果未能解决你的问题,请参考以下文章

请问如何用随机函数生成二叉树,并遍历?

java 求二叉树的叶子结点,下面的代码不知道哪里出错了!

数据结构C语言描述中关于二叉树

什么是二叉树,举一个二叉树的例子

二叉树

《剑指offer》:[62]序列化二叉树