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

Ich versuche, ein Programm zu schreiben, Hashing mit Ketten zu implementieren. Ich versuche ein Array von Knoten zu erstellen, so dass ich anhängen kann, wenn zwei Strings denselben Hash-Wert haben.Array von Knoten: Initialisierung

Aber ich habe ein Problem mit der Initialisierung von Array von Knoten. Ich dachte, die Knoten im Array würden auf NULL zeigen. Aber als ich versuchte, in gdb zu debuggen, zeigt es etwas anderes. enter image description here

Kann jemand erklären, wo ich falsch bin über Kommentar zu diesem Verhalten. Warum arr 1 und arr [2] zeigen auf einen Speicherort anstelle von null. Ich habe auch versucht, den Standardkonstruktor zu entfernen, aber immer noch die gleichen Ergebnisse zu erhalten. Jede Hilfe wäre willkommen.

Antwort

0

Sie haben Vektor der Größe n von Vektoren der Größe 0 von Strings initialisiert. Dann wollen Sie die '[1]' (das zweite Element des leeren Vektors der Strings) Sie müssen sie separat inualisieren. z.B. in "für" -Zyklus.

Aktualisiert. Verwenden Sie myStore.at (i) .at (1) anstelle von myStore [i] [1], um die Randbedingungen zu überprüfen. (Versuchen Sie es, Sie werden verstehen, dass das Problem mit Vektor tatsächlich)

+0

Haben Sie ein Problem mit Knoten ** arr nicht mit dem Vektor. – Phaneeth

1

Sie ordnen ein Array von Zeigern. Zeiger haben keine Konstruktoren oder Standardinitialisierung; Sie erhalten zufälligen Speicher (aus der Zuweisung).

Wenn das Array NULL-out sein soll, müssen Sie dies selbst tun (zB: memcpy, etc.).

+0

Ich verstehe. Danke für die Antwort. Bin dankbar. – Phaneeth

+0

Betrachten Sie dieses Beispiel. 'struct Node { int Daten; Knoten * weiter; }; int main() { Knoten * Test; if (test == NULL) { cout << "test ist null"; } } ' Also warum in diesem Fall ist es NULL – Phaneeth

+0

In diesem Fall, wenn es NULL ist, ist es zufällig (das heißt, es wäre nicht notwendigerweise NULL wie in der Sprache angegeben). Aufgrund der Stapelbenutzungssemantik ist es wahrscheinlich eher NULL, aber das ist eine Nebensache. Wirklich, deshalb gibt es einen großen Unterschied zwischen jemandem, der denkt, dass etwas korrekt ist, weil es funktioniert, und jemand, der versteht, warum etwas funktioniert oder nicht. Ich schlage vor, auf C++ mehr zu lesen, wenn Sie in der letzteren Kategorie sein wollen. – Nick