2012-05-13 82 views
0

我想建立一個哈希表,並與我所使用的在線教程我想出了下面的代碼瞭解到C++散列鏈接功能

#include <iostream> 
#include <string> 
#include <cstdlib> 

using namespace std; 
const int SIZE = 100; 

int hash(string); 

class Node 
{ 
    public: 
     Node(); 
     Node(string); 
     int hash(int value); 
    private: 
     string data; 
     Node* next; 

    friend class HashTable; 
}; 

Node::Node() { 
    data = ""; 
    next = NULL; 
} 

Node::Node(string) { 
    data = ""; 
    next = NULL; 
} 

int Node::hash(int value) { 
    int y; 
    y = value % SIZE; 
} 

class HashTable { 
public: 
    HashTable(); 
     HashTable(int); 
     ~HashTable(); 
     void insertItem(string); 
     bool retrieveItem(string); 

private: 
     Node* ht; 
}; 

HashTable::HashTable() { 
    ht = new Node[SIZE]; 
} 

HashTable::HashTable(int max) { 
    ht = new Node[max]; 
} 

HashTable::~HashTable() { 
    delete[] ht; 
} 

void HashTable::insertItem(string name) { 
    int val = hash(name); 
    for (int i = 0; i < name.length(); i++) 
     val += name[i]; 
} 

bool HashTable::retrieveItem(string name) { 
    int val = hash(name); 
    if (val == 0) { 
     cout << val << " Not Found " << endl; 
    } 
    else { 
     cout << val << "\t" << ht->data << endl; 
    } 
} 

void print() { 
    //Print Hash Table with all Values 
} 

int main() { 

    HashTable ht; 
    ht.insertItem("Allen"); 
    ht.insertItem("Tom"); 

    ht.retrieveItem("Allen"); 

    //data.hash(int val); 
    //cout << ht; 

    system("pause"); 
    return 0; 
} 


int hash(string val) { 
    int key; 
    key = val % SIZE; 
} 

我嘗試插入字符串值和驗證,如果名稱使用retrieveItem函數存在。 另外,我該如何去打印帶有值的HashTable。

任何幫助將不勝感激。

Vish

+0

問題是什麼? –

+0

我的代碼不起作用!代碼的哪部分是錯的?或者如果整個代碼都是錯誤的,那麼解決方案是什麼? – Vish

+2

有很多錯誤;如果你有兩個構造函數並且不保存長度,你怎麼知道這個數組有多大?你爲什麼試圖在字符串上使用模數?你實際上並沒有在'insertItem'中插入任何東西,也沒有在'retrieveItem'中返回任何東西。 –

回答

0

這裏有很多錯誤。只要在代碼中間的隨機點一瞧,我發現:

Node::Node(string) { 
    data = ""; 
    next = NULL; 
} 

這並不保存在傳遞的字符串的值,我猜你真正想要的東西更像:

Node::Node(string value) : data(value), next(NULL) {} 

我看到的下一件事是:

int Node::hash(int value) { 
    int y; 
    y = value % SIZE; 
} 

該計算的值,並把它變成y(局部變量),但不返回任何東西,所以你計算的值是immedi吃掉了。如果你試圖使用它的返回值,你會得到未定義的行爲(實際上,我不太確定 - 它看起來像在C中,只有在嘗試使用返回值時才能獲得UB,但在C++中它是UB這一切 - 不管技術細節如何,這顯然不是你想要的,需要修復的)。

就像我說的,我只是瞥了一眼代碼中的一處,然後發現 - 我懷疑它們是唯一的問題。底線是,您可能需要備份一下,找出每個功能應該做的事情,然後逐個檢查它們,並確保每個功能都按照它的設想進行。

另外一點建議:不要自己動態分配數組,而是使用std::vector

+0

謝謝傑瑞!我會研究這些功能。我只是從C++開始學習,因爲我去... – Vish

+0

這是我更新的代碼 – Vish

0

只是使用STL的HashMap 或 的線程HashMap中使用英特爾®線程構建模塊庫

+0

謝謝凱!但我是初學者,所以不知道你的意思;)。我正在嘗試使用鏈接列表和哈希鏈接來完成此操作 – Vish