0

我写了这个 BST 来计算给定文件中每个单词的数量。该文件的每一行都有重复的单词。

/*all necessary headers*/
class tree
{
public:
    tree(string _word) : left( NULL ), right ( NULL ), m_word(_word), count(1) {}

    tree* createTree(tree *newNode, string _word)
    {

        if( newNode == NULL )
            newNode = new tree(_word);

        else if( _word == newNode->m_word)
            newNode->count++;

        else if( _word < m_word)
            newNode->left  = createTree(newNode->left,_word);

        else
            newNode->right = createTree(newNode->right,_word);

        return newNode;
    }

private:
    string m_word;
    int count;
    tree *left;
    tree *right;

};

int main()
{
    string csword;
    tree *node = NULL;
    ifstream str("word.txt");
    while( !str.eof())
    {
        str>>csword;
        node = node->createTree(node,csword);

    }
}

我的查询是: 1. 在main()我初始化nodetoNULL时,我使用相同的指针来调用这些trees方法。程序不应该崩溃吗?因为我要取消引用NULL指针?

2:当我在g++编译器(gcc 4.6.3)上运行这段代码时,程序在提交createTree()方法时_word == newNode->m_word并没有返回。条件中似乎存在无限循环else if ( _word == newNode->m_word )

但是在 Visual Studio 2008 上执行相同的代码没有问题,我能够得到正确的答案。

关于查询 1 和 2 的任何想法?

4

1 回答 1

2

根据实现(我的是 MSVC++),只有当您实际访问不存在对象的任何成员时,它才可能导致分段错误。由于你createTree没有触及任何东西,它几乎就像一个静态函数一样工作,它不会导致分段错误。

也许你应该做到static,比现在的方式更有意义。

于 2013-08-27T05:54:07.073 回答