节点数组:初始化

时间:2017-03-18 17:31:56

标签: c++ arrays nodes

#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。我也尝试删除默认构造函数,但仍然得到相同的结果。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:1)

你正在分配一个指针数组。指针没有构造函数或默认初始化;你得到随机记忆(来自分配)。

如果你想让数组被清空,你需要自己做(例如:memcpy等)。

答案 1 :(得分:0)

你已经初始化了大小为0的字符串大小为n的向量。 然后你想得到'[1]'(字符串空矢量的第二个元素) 你必须单独使用它们。 例如在“for”循环中。

更新。使用myStore.at(i).at(1)代替myStore [i] [1]来实现边界条件的检查。 (尝试一下,你会明白矢量确实存在问题)