c++でハッシュテーブルを実装したいです
を参考にして、ハッシュテーブルを実装しています。
リンク先のコードは正しく動くのですが、これをintではなく、charで実装したいです。
ソースコードを
int k-> char k
int v ->char v
と安直に変更すると、「コンパイルは通りますが、正しく挙動しません」
型を変えたことによって他にも変えるべきところがあるのだと推察しておりますが、詳しく分かりません。(ハッシュ関数の計算の部分でしょうか?)
ご教授頂けましたら幸いです。
発生している問題・エラーメッセージ
文字列を入力するとメッセージが止まらず、無限に流れている。
該当のソースコード
c++
1#include<iostream> 2#include<cstdlib> 3#include<string> 4#include<cstdio> 5using namespace std; 6const int T_S = 200; 7class HashTableEntry { 8 public: 9 char k; 10 char v; 11 HashTableEntry(char k, char v) { 12 this->k= k; 13 this->v = v; 14 } 15}; 16class HashMapTable { 17 private: 18 HashTableEntry **t; 19 public: 20 HashMapTable() { 21 t = new HashTableEntry * [T_S]; 22 for (int i = 0; i< T_S; i++) { 23 t[i] = NULL; 24 } 25 } 26 int HashFunc(char k) { 27 return (k % T_S); 28 } 29 void Insert(char k, char v) { 30 int h = HashFunc(k); 31 while (t[h] != NULL && t[h]->k != k) { 32 h = HashFunc(h + 1); 33 } 34 if (t[h] != NULL) 35 delete t[h]; 36 t[h] = new HashTableEntry(k, v); 37 } 38 int SearchKey(char k) { 39 int h = HashFunc(k); 40 while (t[h] != NULL && t[h]->k != k) { 41 h = HashFunc(h + 1); 42 } 43 if (t[h] == NULL) 44 return -1; 45 else 46 return t[h]->v; 47 } 48 void Remove(char k) { 49 int h = HashFunc(k); 50 while (t[h] != NULL) { 51 if (t[h]->k == k) 52 break; 53 h = HashFunc(h + 1); 54 } 55 if (t[h] == NULL) { 56 cout<<"No Element found at key "<<k<<endl; 57 return; 58 } else { 59 delete t[h]; 60 } 61 cout<<"Element Deleted"<<endl; 62 } 63 ~HashMapTable() { 64 for (int i = 0; i < T_S; i++) { 65 if (t[i] != NULL) 66 delete t[i]; 67 delete[] t; 68 } 69 } 70}; 71int main() { 72 HashMapTable hash; 73 char k, v; 74 int c; 75 while (1) { 76 cout<<"1.Insert element into the table"<<endl; 77 cout<<"2.Search element from the key"<<endl; 78 cout<<"3.Delete element at a key"<<endl; 79 cout<<"4.Exit"<<endl; 80 cout<<"Enter your choice: "; 81 cin>>c; 82 switch(c) { 83 case 1: 84 cout<<"Enter element to be inserted: "; 85 cin>>v; 86 cout<<"Enter key at which element to be inserted: "; 87 cin>>k; 88 hash.Insert(k, v); 89 break; 90 case 2: 91 cout<<"Enter key of the element to be searched: "; 92 cin>>k; 93 if (hash.SearchKey(k) == -1) { 94 cout<<"No element found at key "<<k<<endl; 95 continue; 96 } else { 97 cout<<"Element at key "<<k<<" : "; 98 cout<<hash.SearchKey(k)<<endl; 99 } 100 break; 101 case 3: 102 cout<<"Enter key of the element to be deleted: "; 103 cin>>k; 104 hash.Remove(k); 105 break; 106 case 4: 107 exit(1); 108 default: 109 cout<<"\nEnter correct option\n"; 110 } 111 } 112 return 0; 113}
試したこと
int k-> char k
int v ->char v
と変更してみた。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。