2017-03-18 12 views
0
#include <iostream> 
#include <vector> 
#include <string> 
#include <math.h> 

using namespace std; 

struct Node{ 
    string data; 
    Node* next; 
    Node(){ 
     data = ""; 
     next = NULL;  
    }  
}; 

int computeHash(string s, int m){ 
    int p = 1000000007; 
    int x = 263; 
    unsigned long long sum = 0; 
    unsigned long long val = 0; 
    for(int i = 0; i < s.length(); i++){ 
     val = pow(x, i); 
     sum = (sum + s[i] * val) % p; 
    } 
    sum = sum % m; 
    return sum; 
} 

int main(){ 
    int buckets; 
    cin >> buckets; 
    int n; 
    cin >> n; 
    string tag; 
    string s; 
    vector< vector<string> > myStore(n); 
    for(int i = 0; i < n; i++){ 
     cin >> s; 
     myStore.at(i).push_back(s); 
     cin >> tag; 
     myStore.at(i).push_back(tag); 
    } 
    Node** arr= new Node*[buckets]; 
    for(int i = 0; i < n; i++){ 
     if(!myStore[i][0].compare("add")){ 
      s = myStore[i][1]; 
      int hash = computeHash(s,buckets); 
      cout << hash << endl; 
     } 

    } 

    return 0; 
} 

チェーンでハッシングを実装するプログラムを作成しようとしています。私はノードの配列を作成しようとしているので、2つの文字列が同じハッシュ値を持つ場合は追加できます。ノードの配列:初期化

しかし、ノードの配列の初期化に問題があります。私は、配列内のノードがNULLを指していると思った。しかし、私はgdbでデバッグしようとしたときに、別のことを示しています。 enter image description here

誰かがこの動作についてのコメントに間違いがあると説明できますか。なぜarr 1とarr [2]がヌルの代わりにいくつかのメモリ位置を指しているのはなぜですか?私もデフォルトのコンストラクタを削除しようとしましたが、同じ結果が得られました。どんな助けもありがとう。

答えて

0

文字列のサイズ0のベクトルのサイズnのベクトルを初期化しました。 次に、 '[1]'(文字列の空のベクトルの2番目の要素)を取得します。 それらを別々にインテル化する必要があります。例: 「for」サイクルで。

更新されました。境界条件のチェックを行うには、myStore [i] [1]の代わりにmyStore.at(i).at(1)を使用します。 (実際にベクトルの問題が理解できるでしょう)

+0

ベクターではなくノード**の配列に問題があります。 – Phaneeth

1

あなたはポインタの配列を割り当てています。ポインタにはコンストラクタやデフォルトの初期化がありません。 (割り当てから)ランダムなメモリを取得しています。

アレイをNULLにする場合は、自分で行う必要があります(例:memcpyなど)。

+0

私は参照してください。答えをありがとう。感謝します。 – Phaneeth

+0

この例を検討してください。 'structノード{ intデータ; ノード* next; }; int main(){ ノード*テスト; if(test == NULL){ cout << "test is null"; } なぜこの場合はNULLですか? – Phaneeth

+0

この場合、NULLの場合、ランダムチャンスがあります(つまり、言語で指定されているようにNULLである必要はありません)。スタック使用のセマンティクスのためにNULLになる可能性がありますが、それは脇にあります。 これは実際に何かが正しいと思う人と、何かが正常に動作していることを理解している人と、何かが動作しているかどうかを理解している人の間に大きな違いがある理由です。あなたが後者のカテゴリーに入りたいなら、C++でもっと読むことをお勧めします。 – Nick