2012-03-09 19 views
0

私はハフマンエンコーディングを使ってC++で基数ツリーを構築しています。私はフォローするアルゴリズムを与えられました。私が書いたことはうまくいくはずですが、クラッシュしています。基数木を構築する助けが必要です。C++

私はこのアルゴリズムを以下午前:工事が完了したときにあなたが知っているように、

  • は(Nの文字は、このアルゴリズムのN-1ループが必要な)カウンタを使用してください。
  • 「ルート」ノードの2つの最小頻度を見つけるポインタの配列を渡します。
  • 新しいノードを作成し、(b)で見つかったノードからの頻度の合計を格納し、(b)で見つかったノードをその子として格納し、配列内のポインタの1つをこの新しいノードのアドレスに置き換え、他を0にします。
  • 結果をテストするには、BSTDumpを使用します。左右の割り当て方法と「新しいルート」によって、結果が異なることに注意してください。

私は、この機能で自分の結果をテストしようとしています:ここで

void BSTDump(Node * r) 
{ 
    static bool first = true; 
    if (first) 
    { 
     cout << "Parent Left Right" << endl 
      << "---------------------" << endl; 
     first = false; 
    } 
if (r != 0) 
{ 
    BSTDump(r->left); 
    BSTDump(r->right); 
    cout << setw(4) << r->theChar << r->freq; 
    if (r->left != 0) 
     cout << setw(8) << r->left->freq; 
    else 
     cout << setw(8) << '*'; 
    if (r->right != 0) 
     cout << setw(8) << r->right->freq << endl; 
    else 
     cout << setw(8) << '*' << endl; 
} 
} 

は、ノードの構造である:

struct Node 
{ 
    double freq; 
    char theChar; 
    Node * left; 
    Node * right; 
}; 

そして、ここでは、私がどの構築機能で書かれているものです何が正しく動作していないのですか。

void ConstructTree(Node * &r) 
{ 
Node * N[ASIZE]; 

for (int i = 0; i < ASIZE; i++) 
{ 
    N[i] = new Node; 
    assert(N[i] != 0); 
    N[i]->left = N[i]->right = 0; 
    cout << "Enter the char and its frequency: "; 
    cin >> N[i]->theChar >> N[i]->freq; 
} 

int Num = ASIZE; 
while (Num > 1) 
{ 
    // find two smallest. 
    Node * p1; 
    Node * p2; 

    //p1->theChar = p2->theChar = N[0]->theChar; 
    //p1->freq = p2->freq = N[0]->freq; 
    //p1->left = p1->right = p2->right = p2->left = 0; 

    p1 = p2 = N[0]; 

    for(int i = 0; i < ASIZE; i++) 
    { 
     if(N[i]->freq > p1->freq){ 

      //p2->theChar = p1->theChar; 
      //p2->freq = p1->freq; 
      //p1->theChar = N[i]->theChar; 
      //p1->freq = N[i]->freq; 

      p2 = p1; 
      p1 = N[i]; 

     } 
    }  
    // create a new node 
    Node * sum = new Node; 
    sum->freq = p1->freq + p2->freq; 
    sum->left = p2; 
    sum->right = p1; 

    // update array N contents 
    N[Num] = sum; 
    delete sum; 


    Num--; 
} 
// make certain that r knows where the root is 
r = N[0]; 
} 

何が問題なのか?

+1

、あなたはクラッシュの原因行を発見するでしょう、そしてあなたはそこから逆方向に動作することができます。 –

答えて

0

ハム...

// create a new node 
Node * sum; 

これは、ノードを作成ないです。これは未初期化Nodeへのポインタとして宣言しています。

ここに= new Node();の部分がありません。

0

マシューM.​​はすでにバグを発見:ここに別:デバッガでプログラムを実行した場合

// find two smallest. 
    Node * p1 = 0; 
    Node * p2 = 0; 
    p1->left = p1->right = p2->right = p2->left = 0; 
関連する問題