2017-03-18 252 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; 
} 

我想編寫一個程序來實現哈希與鏈。我試圖創建一個節點數組,以便我可以追加如果兩個字符串具有相同的散列值。節點陣列:初始化

但我有一個節點數組初始化的問題。我以爲數組中的節點將指向NULL。但是當我嘗試在gdb中調試時,它顯示了一些其他的東西。 enter image description here

有人可以解釋我對這種行爲發表評論的錯誤嗎?爲什麼arr 1和arr [2]指向一些內存位置而不是null。我也嘗試刪除默認的構造函數,但仍然得到相同的結果。任何幫助,將不勝感激。

回答

0

您已初始化大小爲0的向量的大小爲n的向量。 然後你想得到'[1]'(字符串空向量的第二個元素) 你必須分別創建它們。 例如在「for」循環中。

已更新。使用myStore.at(i).at(1)而不是myStore [i] [1]來檢查邊界條件。 (嘗試一下,你會明白,真正的矢量問題)

+0

對Node ** arr有問題,不與矢量。 – Phaneeth

1

你正在分配一個指針數組。指針沒有構造函數或默認初始化;你會得到隨機存儲器(來自分配)。

如果您希望數組爲空值,您需要自己完成(例如:memcpy等)。

+0

我明白了。感謝你的回答。欣賞它。 – Phaneeth

+0

考慮這個例子。 'struct Node {int data; Node * next; }; int main(){ Node * test;如果(test == NULL)cout <<「test is null」;如果(測試== NULL){ } } 那麼,爲什麼在這種情況下,它爲NULL – Phaneeth

+0

在這種情況下,如果它是NULL,它是隨機的(也就是說,它不一定是NULL如在語言中指定)。由於堆棧使用語義,它可能更有可能是NULL,但這是一個問題。 真的,這就是爲什麼有人認爲某件事是正確的,因爲它正在工作,並且有人明白爲什麼某件事正在或未起作用,這是很大的區別。如果你想進入後一類,我建議你多閱讀一下C++。 – Nick