2017-03-18 198 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