2016-12-02 23 views
-1

私はC++の線形および二次探索のハッシュテーブルの実装に取り​​組んでいます。 Hash.cppには、動作するlinearProb(int key)関数とquadProb関数があります。 main.hppから別々に呼び出すと、正しいハッシュテーブルが出力されますが、コンパイル時に線形と二次の両方のテーブルの結果を見たいと思います。C++の印刷配列

これは(quadProbが似ています)

void Hash::linearProb(int key){ 

    int i, count = 0; 
    Hash h; 

    //if it is empty, place it there 
    if (a[key % tableSize] == -1) 
    a[key % tableSize] = key; 

    else{ 
     i = 0; 

     //until finding an empty slot, but don't loop around 
     while (i < tableSize && a[i] != -1){ 
       count++; 
       i++; 
     } 

     if(count == tableSize){ 
      cout<<key<<" could not be inserted in the table\n"; 
      exit(1); 
     } 
     //when there's a collision increase i by 1 until finding empty slot 
     for(i = (key % tableSize+1) % tableSize; i <tableSize; i++){ 
      if(a[i] == -1){ 
       a[i] = key; 
       break; 
      } 
     } 
    } 
} 

私linearProbであると私は、この

ようmain.cppにそれを呼び出す場合、私はまたHash.cpp

void Hash::print(){ 
    int i; 

    //cout<<"Hash Table with Linear Probing"<<endl; 
    cout<<"\n Result Hash Table: "<<endl; 

    for(i = 0; i < tableSize; i++){ 
     cout<<"\n"<<i; 
     if(a[i] != -1){ 
     cout<<" "<< a[i]; 
     } 
    } 
    cout<<"\n"; 
} 

の印刷を()持っています

int main(){ 
    int key; 
    Hash h; 

    //take in .txt file 
    std::fstream file; 
    file.open("keys.txt"); 

    while(!file.eof()){ 
     file >> key; 

     if(key != -1){ 
     h.linearProb(key); 
     //h.quadProb(key); 
     } 
    } 

    file.close(); 

    if(key == -1){ 
     h.print(); 
    } 
} 

私のプロービングが動作するのがわかりますが、linearProbをテストするためにquadProbをコメントアウトしたことに気付きました。私は両方のテーブルを同時に印刷したいと思う。これを行うために、私はmainから呼び出すのではなく、各プロービング関数でprint()を呼び出そうとしました。

これは私が試みたものです。私は

while(!file.eof()){ 
    file >> key; 

    h.linearProb(key); 
    //h.quadProb(key);   
} 

file.close(); 

に()メイン変更とlinearProb(int型のキー)

void Hash::linearProb(int key){ 
    int i, count = 0; 
    Hash h; 

    if(key == -1){ 
     h.print(); 
     exit(1); 
    } 
} 

に追加しかし、これは[i]はせずに0〜9をプリントアウト。私がprint()に入ったときに何がテストされたのか、それは私にすべてのi値が-1の[i]を与え、何も印刷しないことにつながります。なぜこれが起こっているのか、私は本当に混乱しています。 main()からprint()を呼び出したときにprint()がうまく行かないのはなぜですか?

+0

私はあなたのコードを読んでちょっと混乱していますが、あなたは[最小、完全で、検証可能な例](http://stackoverflow.com/help/mcve)を提供してください。 – Steeve

+0

コードを挿入するとき:書式設定されたコードを挿入し、すべてを選択して{}アイコン(コードサンプル) – stefaanv

答えて

2

"print from probe関数"では、関数で宣言されている空のハッシュhを出力します。 Hash h;を削除し、h.print()の代わりにprint()と呼ぶだけです。

これは、デバッガが役立つ素晴らしい問題です。そのブランチを中断すると、空のhが表示され、メインではhが埋められます。