2017-03-18 2 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 [i] [1] 대신 myStore.at (i) .at (1)을 사용하십시오. (시도해보십시오. 실제로 벡터 문제가 있다는 것을 이해할 것입니다.)

+0

노드 ** arr에 벡터가없는 문제가 있습니다. – Phaneeth

1

포인터의 배열을 할당하고 있습니다. 포인터에는 생성자 또는 기본 초기화가 없습니다. 당신은 할당에서 임의의 메모리를 얻고 있습니다.

배열을 NULL로 만들려면 자신이해야합니다 (예 : memcpy 등).

+0

알겠습니다. 답변 해주셔서 감사합니다. 고맙습니다. – Phaneeth

+0

이 예제를 고려하십시오. 'struct 노드 { int 데이터; 노드 * 다음; }; int main() { 노드 * 테스트; if (test == NULL) { cout << "test is null"; } } 그렇다면이 경우 NULL이됩니다. – Phaneeth

+0

이 경우 NULL이되면 임의의 기회가됩니다 (즉, 언어에 지정된대로 NULL 일 필요는 없습니다). 스택 사용 의미 때문에 NULL이 될 가능성이 더 클 수도 있지만 그건 제쳐두고. 실제로 이것이 뭔가 효과가 있다고 생각하는 사람과 무언가가 작동하는 이유 또는 작동하지 않는 이유를 이해하는 사람 사이에 큰 차이가있는 이유입니다. 나는 당신이 후자의 범주에 있기를 원한다면 C++에 대해 더 읽기를 제안합니다. – Nick