2011-12-28 24 views
-1

私はチェーンアルゴリズムによってハッシュテーブルを実装するために以下のコードをプログラムし、私はmain機能でそれを使用する場合、結果が間違っている:の後に、このクラスを実装間違った結果

#define _SIZE 1000 

class HashEntry 
{ 
    public: int Tel; 
      string Name; 

    public: HashEntry(){} 
    public: HashEntry(int Tel, string Name) 
    { 
     this->Tel = Tel; 
     this->Name = Name; 
    } 
}; 

class Link { 
    public: 
    HashEntry data; 
     Link *next; 

    public: 
     Link() : next(NULL){ } 

}; 

void Insert (Link *head, HashEntry data) 
{ 
    Link *t= new Link; 
    t->data=data; 

    if(head==NULL) 
    { 
     head = new Link; 
     head->next = NULL; 
     head->data = data; 
     return; 
    } 

    Link *head2= head; 
    while(head2->next!=NULL) 
    {  
     if(head2->data.Name == data.Name) 
      return; 
     head2=head2->next; 
    } 

    head2->next=t; 
} 

class HashTable { 
    public: 
    Link **a; 
    public: 
    HashTable() 
     { 
      a = new Link *[_SIZE]; 
      for (int i=0; i<_SIZE; i++) 
       a[i]=NULL; 
     } 

    public: 
     int HashFonction (string key) 
     { 
      int res=0; 
      for (int i = 0; i < key.length(); i ++) 
      { 
       char ch = key.at(i); 
       if(i%2==0) 
        res+=(int)ch; 
       else 
        res-=(int)ch; 
      } 

      return (int)fabsf((float)res) % _SIZE; 
     } 

     void HashInsert (string key, int val){ 
      int index= HashFonction(key); 
      HashEntry s(val, key); 
      Insert(a[index],s); 
     }  

     int HashSearch(string key) 
     { 
      int inx=HashFonction(key); 
      Link *head=a[inx]; 

      if(head==NULL){ 
       return -1; 
      } 

      while(head!=NULL){ 
       if(head->data.Name==key) 
        return head->data.Tel; 

       head=head->next; 
      } 

      return -1; 
     } 
}; 

、私は、コードを次のようにプログラムしかし、検索の結果は-1: -/

HashTable ht; 
ht.HashInsert("Hossein", 849348); 
ht.HashInsert("Ali", 94343); 
ht.HashInsert("Fatemeh", 940343); 

cout << ht.HashSearch("Ali") << endl; // output = -1 :-/ 

誰が間違っているかを説明してもらえますか?

+1

コードをデバッグして、どこでエラーが発生したかを特定してください。挿入段階で? [はいの場合 - どこに?]を検索しますか? [それはなぜ検索に失敗する?] – amit

+0

私はそれがかなり正しいと思います! -/ –

+1

あなたはデバッガを使うべきです[あなたのIDEにデバッガがない場合はprintfの束を使用してください]。そして、すべての挿入が正しく行われたかどうかを最初にチェックしてください。 *正確に*失敗した場所を調査してから、探しに行き、同じ方法で確認してください。 – amit

答えて

1

関数の挿入先に値を渡すので、クラスのハッシュテーブルの配列 "a"は変更されません。参照を渡すと、問題が解決されます。

void Insert (Link *&head, HashEntry data) 
+0

感謝の負荷:)それは私の問題を解決:) :)ありがとう –

2

あなたの問題は基本的にポインタがあなたに金額をやろうとしているどのような値

によって渡され

void Insert (Link *& head, HashEntry data) 

void Insert (Link * head, HashEntry data) 

変更、それをあるあなたの注意のための

感謝

void Bar(Link* input) 
{ 
    input = new Link(); 
} 

Link* foo = 0; 
Bar(foo); 

バーがfoo を返すと、まだ0になります。値でポインタを渡すと、ポインター自体ではなくポインターの内容を変更できます。意図したように上記のスタッフの仕事を作るために、あなたは

ALTERNATIVE 1

参照することにより、ポインタ渡し

void Bar(Link*& input) 
{ 
    input = new Link(); 
} 

Link* foo = 0; 
Bar(foo); 

ALTERNATIVE 2

はへのポインタを渡すことができますポインタ

void Bar(Link** input) 
{ 
    *input = new Link(); 
} 

Link* foo = 0; 
Bar(&foo); 
+0

THANK LOADS :)それは私の問題を解決しました:)ありがとう –