当前位置:   article > 正文

HashTable类模板_C++

HashTable类模板_C++

好久没看数据结构了,今天终于要用到hash,整理一下写了个hash类模板

  1. template<typename T>
  2. class DataType
  3. {
  4. public:
  5. T key;
  6. DataType(T k):key(k){}
  7. DataType(void){}
  8. bool operator ==(const DataType &a)
  9. {
  10. return key == a.key;
  11. }
  12. bool operator !=(const DataType &a)
  13. {
  14. return key != a.key;
  15. }
  16. };
  17. enum KindOfItem{Empty, Active, Delete};
  18. template<typename T>
  19. class HashItem
  20. {
  21. public:
  22. DataType<T> data;
  23. KindOfItem info;
  24. HashItem(KindOfItem i = Empty):info(i){}
  25. HashItem(DataType<T> d, KindOfItem i = Empty):data(d),info(i){}
  26. bool operator ==(const HashItem & a)
  27. {
  28. return a.data == data;
  29. }
  30. bool operator !=(const HashItem &a)
  31. {
  32. return a.data != data;
  33. }
  34. };
  35. template<typename T>
  36. class HashTable
  37. {
  38. public:
  39. const int size;
  40. HashItem<T> *ht;
  41. int FindItem(const HashItem<T> &a);
  42. int InsertItem(const HashItem<T> &a);
  43. int DeleteItem(const HashItem<T> &a);
  44. HashTable(int k);
  45. ~HashTable();
  46. };


  1. template<typename T>
  2. HashTable<T>::HashTable(int k):
  3. size(k),
  4. ht(0)
  5. {
  6. ht = new HashItem<T>[size];
  7. }
  8. template<typename T>
  9. HashTable<T>::~HashTable()
  10. {
  11. if (ht)
  12. {
  13. delete[]ht;
  14. ht =0;
  15. }
  16. }
  17. template<typename T>
  18. int HashTable<T>::FindItem(const HashItem<T> &a)
  19. {
  20. int i = a.data.key%size;
  21. int j = i;
  22. while (ht[j].info == Active && ht[j].data != a.data)
  23. {
  24. j = (j+1)%size;
  25. if (j == i)
  26. {
  27. return -size;
  28. }
  29. }
  30. if (ht[j].info == Active)
  31. {
  32. cout<<"发现数据"<<endl;
  33. return j;
  34. }
  35. else
  36. {
  37. return -j;
  38. }
  39. return 0;
  40. }
  41. template<typename T>
  42. int HashTable<T>::InsertItem(const HashItem<T> &a)
  43. {
  44. int i = FindItem(a);
  45. if (i > 0 || (i==0 && ht[0].info == Active))
  46. {
  47. return -1;
  48. }
  49. if (i == -size)
  50. {
  51. cout<<"hashtable已满,插入失败"<<endl;
  52. return -1;
  53. }
  54. else
  55. {
  56. ht[-i] = a;
  57. ht[-i].info = Active;
  58. }
  59. cout<<"插入成功"<<endl;
  60. return i;
  61. }
  62. template<typename T>
  63. int HashTable<T>::DeleteItem(const HashItem<T> &a)
  64. {
  65. int i = FindItem(a);
  66. cout<<i<<endl;
  67. if (i < 0|| (i==0 && ht[0].info != Active))
  68. {
  69. cout<<"无此数据"<<endl;
  70. return -1;
  71. }
  72. ht[i].info = Delete;
  73. cout<<"删除成功"<<endl;
  74. return i;
  75. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/678514
推荐阅读
相关标签
  

闽ICP备14008679号