3

遺伝子配列決定の課題の一環として、C++ でサフィックス ツリーを作成しようとしています。

void Tree::insert(string ins)  
{  
  Node* iterator = chooseBranch(root, ins.at(0));  
  string temp;  
  for(int i=0; i<100; i++)  
    {  
      if(iterator->data=="")  
.
.
.

chooseBranch()は、4 つの子のどちらに移動するかを選択する関数であり、このノードが既に存在するかどうかを確認しようとしています。私のノードクラスは次のとおりです。

struct Node{  
  Node();  
  string data;  
  Node* A;  
  Node* G;  
  Node* C;  
  Node* T;  
};

この if ステートメントは、gdb を使用してバックトラックしたセグメンテーション違反を引き起こしています。

#0  0x0000003ce249bbd6 in std::string::compare () from /usr/lib64/libstdc++.so.6
#1  0x000000000040185b in std::operator==<char, std::char_traits<char>, std::allocator<char> > ()
#2  0x0000000000401305 in Tree::insert ()
#3  0x00000000004016d4 in Tree::Tree ()
#4  0x00000000004010a2 in main ()

この形式の NULL チェックの何が問題になっていますか? ノードにデータがないかどうかを確認するにはどうすればよいですか?

4

1 に答える 1

2

iteratorポインターをまったくチェックしているようには見えませんNULL。単に逆参照しているだけです (ポインターが の場合、ドラマが発生しますNULL)。

試してみるサンプルを次に示します。チェックはループNULLから巻き上げられます。for


void Tree::insert(string ins)
{
    Node* iterator = chooseBranch(root, ins.at(0));
    if (iterator)
    {
        string temp;
        for(int i=0; idata=="")
...
于 2010-02-23T03:43:51.353 に答える