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

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

HashTable类模板_C++的更多相关文章

  1. 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

    第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...

  2. 3.2 STL中的函数对象类模板

    *: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...

  3. C++STL - 类模板

    类的成员变量,成员函数,成员类型,以及基类中如果包含参数化的类型,那么该类就是一个类模板   1.定义 template<typename 类型形参1, typename 类型形参2,...&g ...

  4. C++ 类模板的使用

    从事C++挺久了,在前段时看书时,发现高手,都是在写模板无,泛型编程,顿感差距.自己连模板都没有写,于是就小小的研究了下模板的用法. 模板简而言之就是对某此对象的相同方法,或处理方式,进行归纳,总结, ...

  5. Xcode6中如何使用自定义的类模板

    说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewControll ...

  6. VS2013,VS2015设置类模板文件表头

    一般VS的类模板文件是放在C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSha ...

  7. 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

    [源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...

  8. 类模板的static成员

    下列代码可以通过编译吗?如何修改使其通过编译? template <class T> struct sum {   static void foo(T op1 , T op2){    c ...

  9. 4.1 pair类模板

    在学习关联容器之前,首先先要了解一下STL中的pair类模板,因为关联容器的一些成员函数返回值都是pair对象,而且map 和multimap中的元素都是pair对象. 1)pair类模板定义 pai ...

随机推荐

  1. 从头开始学JavaScript (六)——语句

    原文:从头开始学JavaScript (六)--语句 一.条件分支语句:if 基本格式: if (<表达式1>){    <语句组1>}else if (<表达式2> ...

  2. 【高德地图API】从零开始学高德JS API(六)——坐标转换

    原文:[高德地图API]从零开始学高德JS API(六)——坐标转换 摘要:如何从GPS转到谷歌?如何从百度转到高德?这些都是小case.我们还提供,如何将基站cell_id转换为GPS坐标? --- ...

  3. 转载Worktile 技术架构概要

    Worktile 技术架构概要 其实早就该写这篇博客了,一直说忙于工作没有时间,其实时间挤挤总会有的,可能就是因为懒吧!从2013年11月一直拖到现在,今天就简单谈谈 Worktile 的技术架构吧 ...

  4. MapReduce的InputFormat学习过程

    昨天,经过几个小时的学习.该MapReduce学习的某一位的方法的第一阶段.即当大多数文件的开头的Data至key-value制图.那是,InputFormat的过程.虽说过程不是非常难,可是也存在非 ...

  5. 利用EntityFramework获得双色球数据库

    原文 利用EntityFramework获得双色球数据库 双色球想必大家都很熟悉了,尽管屡买屡不中,但还是会买.以前就想过利用双色球的走势图得到双色球的数据库,至于得到数据库干什么倒没想过,不过对以往 ...

  6. JS中5秒中跳转到其他页面

    原文:JS中5秒中跳转到其他页面 <head> <meta http-equiv="Content-Type" content="text/html; ...

  7. fast-json.jar的用法

    fast-json.jar 解析json数据:一种json数据解析方式是这种,点击这里下载jsonfast.jar+fastjsonAPI文档 [ { "id": 6378, &q ...

  8. HDU Redraw Beautiful Drawings 推断最大流是否唯一解

    点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 ...

  9. android 当目录路径从n层按back键退回到n-19层的时候,file manager自己主动退出

    当目录路径从n层按back键退回到n-19层的时候,file manager自己主动退出,比方在63层按back 键退回到44层的时候,file manager自己主动退出.   1.FileMana ...

  10. java设计模式之四建造者模式(Builder)

    工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...