2012-05-13 9 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; 
} 

私は、文字列値を挿入し、かどうかを検証しようとしていますnameは、retrieveItem関数を使用して存在します。 また、HashTableの値を印刷するにはどうすればいいですか?

ご協力いただければ幸いです。

ビシュ

+0

ライブラリスレッドセーフハッシュマップの使用インテルスレッドビルディングブロックのSTLハッシュマップ または を使用 –

+0

私のコードは動作しません!コードのどの部分が間違っていますか?コード全体が間違っている場合、解決策は何ですか? – Vish

+2

多くのことが間違っています。 2つのコンストラクタがあり、長さを保存しない場合、配列の大きさはどのように分かりますか?なぜあなたは文字列にモジュラスを使用しようとしていますか? 'insertItem'には何も挿入しておらず、' retrieveItem'には何も返していません。 –

答えて

0

ここではかなり間違っています。ただ、コードの途中でランダムにスポットをちらっと見、私が見つかりました:

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

これは、渡された文字列の値を保存していない私はあなたが本当に多くのようなものたかっ推測している:。

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

私が見た次の事でした:これは、値を計算し、y(ローカル変数)に格納しますが、何も返さないので、あなたが計算されてきた値がimmediある

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

一生懸命に失われた。その戻り値を使用しようとすると、未定義の動作が発生します(実際にはわかりませんが、Cでは戻り値を使用しようとするとUBしか得られませんが、C++ではUBこれはまったく - 技術的な詳細にかかわらず、あなたが望むものではなく、修正する必要があることは明らかです。

私が言ったように、私はちょうどコードの一箇所を見て、見つけました - 私は彼らが唯一の問題だとは思わない。最終的には、ちょっとバックアップして、各機能が何をすべきかを把握し、それらを1つずつ実行して、それぞれが確実にやっていることを確実にする必要があるでしょう。

もう1つのアドバイス:自分でアレイを動的に割り当てる代わりに、std::vectorを使用しました。

+0

ありがとうJerry!私はその機能を調べます。私はちょうどC++で始まっているので、私は覚えています... – Vish

+0

これは私の更新されたコードです – Vish

0

だけの質問は何ですか?

+0

ありがとうKay!しかし、私は初心者ですので、あなたが何を意味するのかは分かりません)。私はリンクリストとハッシュチェーンを使用してこれをしようとしています – Vish