插入Trie,NULL指针

时间:2012-01-04 01:02:08

标签: c++ pointers map null trie

我有一个关于Trie数据结构的具体问题以及我的代码出了什么问题。当我递归调用insert时,函数参数root总是为NULL。这是我的代码:

代码:

//subNodes is an array of TrieNode pointers that contains indices for all letters in the alphabet

bool insert(const string& word, TrieNode* root, int curI = 0)
//PRE:  word must be a valid word in a dictionary
//POST: True when a word is inserted into the Trie, false otherwise
{
    if(curI >= word.length())        //word has been scanned fully
    {
        root->isWord = true;
        return true;
    }
    else                             //word has more letters to be scanned
    {
        if(root->subNodes[word[curI] - 'A'] == NULL)    //if the current letter of the word is not in the trie
        {                                            //   insert the letter and advance the current letter of the word
            root->subNodes[word[curI] - 'A'] = new TrieNode(word[curI]);
            insert(word, root->subNodes[word[curI] - 'A'], curI++);
        }
        else                                         //if the currrent letter of the word is in the trie
        {                                            //   advance the current letter of the word
            insert(word, root->subNodes[word[curI] - 'A'], curI++);
        }
    }

}

我通过将subNodes[word[curI] - 'A']替换为subNodes[word[13]]来测试了这一点(13是字母表中N的索引,我正在测试单词not)并且root不再是该调用为NULL。因此索引有问题。有谁知道什么是错的?我考虑过使用C ++地图或矢量。有没有人对使用数组有任何不同意见?

2 个答案:

答案 0 :(得分:0)

您的意思是++curl - 即将递增的值传递给递归调用?由于curl++是后递增的,因此您将相同的值传递给每个递归。不管怎样,编写curl + 1可能更容易,因为您不再需要卷曲值。

答案 1 :(得分:0)

这里有两个问题。

  1. 如果修改了变量,则在两个序列点之间,只能访问该变量以确定要存储的新值。在您的代码中,当您调用insert()时,curI会增加,并且还可以作为参数传递。这是错误的。
  2. C标准未定义功能参数评估顺序。
  3. http://en.wikipedia.org/wiki/Sequence_point

    http://c-faq.com/expr/seqpoints.html

    以下将解决问题。

    insert(word, root->subNodes[word[curI] - 'A'], curI);
    curI++;