C++ 实现哈希表的实例

C++ 实现哈希表的实例

该散列表的散列函数采用了除法散列函数、乘法散列函数、全域散列函数,每一个槽都是使用有序单向链表实现。

实现代码:

LinkNode.h


#include<iostream>
using namespace std;
class Link;
class LinkNode
{
private:
  int key;
  LinkNode* next;
  friend Link;
public:
  LinkNode():key(-1),next(NULL){}
  LinkNode(int num):key(num),next(NULL){}
  int Getkey()
  {
    return key;
  } 

};

Link.h

#include"LinkNode.h"
class Hash;
class Link
{
private:
  friend Hash;
  LinkNode* head;
  int length;
public:
  Link():head(NULL),length(0)
  {}
  Link(LinkNode* node):head(node)
  {
    length+=1;
  }
  ~Link()
  {
    MakeEmpty();
  }
  void MakeEmpty()
  {
    if(head==NULL)
      return ;
    LinkNode* p=head;
    while(p)
    {
      head=head->next;
      delete p;
      p=head;
    }
  }
  int GetLength()
  {
    return length;
  }
  void Insert(int num)
  {
    length++;
    LinkNode* p=new LinkNode(num);
    if(head==NULL)
    {
      head=p;
      return ;
    }
    LinkNode* q=head,*t=head->next;
    if(q->key>num)
    {
      head=p;
      head->next=q;
      return ;
    }
    while(t)
    {
      if(t->key>=num)
      {
        q->next=p;
        p->next=t;
        return ;
      }
      else
      {
        q=t;
        t=t->next;
      }
    }
    q->next=p;
  }
  bool Delete(int num)
  {
    if(head==NULL)
    {
      cout<<"the link is empty!"<<endl;
      return 0;
    }
    LinkNode* p=head,*t=head->next;
    if(p->key==num)
    {
      head=head->next;
      delete p;
      length--;
      return 1;
    }
    while(t)
    {
      if(t->key==num)
      {
        p->next=t->next;
        delete t;
        length--;
        return 1;
      }
      else if(t->key<num)
      {
        p=t;
        t=t->next;
      }
    }
    return 0;
  }
  int Search(int num)
  {
    LinkNode* p=head;
    while(p)
    {
      if(p->key==num)
      {
        return num;
      }
      else if(p->key<num)
      {
        p=p->next;
      }
      else
      {
        return 0;
      }
    }
    return 0;
  }
  bool IsEmpty()
  {
    if(head==NULL)
    {
      return 1;
    }
    else
      return 0;
  }
  void Print(int num)
  {
    if(head==NULL)
    {
      cout<<"the"<<num<<"th link is null!"<<endl;
    }
    LinkNode* p=head;
    while(p)
    {
      cout<<p->key<<" ";
      p=p->next;
    }
    cout<<endl;
  }
};

Hash.h

Hash表中每一个元素存储一个链表

#include"Link.h"
class Hash
{
private:
  Link*Table;
public:
  Hash(int num):Table(new Link [num]){}
  ~Hash()
  {
    delete [] Table;
  }
  //除法散列法
  int H1(int num,int m)
  {
    return num%m;
  }
  //乘法散列法
  int H2(int num,float A,int m)
  {
    float fnum=(float)num;
    float re=((fnum*A)-(int)(fnum*A))*m;
    return (int)re;
  }
  //全域散列
  int H3(int num,int p,int m)
  {
    int a,b;
    a=rand()%p;
    b=rand()%p;
    return ((a*num+b)%p)%m;
  }
  void Insert(int num,int n)
  {
    int key; 

    if(n==1)
    {
      key=H1(num,17);
    }
    else if(n==2)
    {
      key=H2(num,0.618033,17);
    }
    else
    {
      key=H3(num,701,17);
    }
    Table[key].Insert(num);
  }
  bool Delete(int num,int n)
  {
    int key;
    if(n==1)
    {
      key=H1(num,17);
    }
    else if(n==2)
    {
      key=H2(num,0.618033,17);
    }
    else
    {
      key=H3(num,701,17);
    }
    return Table[key].Delete(num);
  }
  int Search(int num,int n)
  {
    int key; 

    if(n==1)
    {
      key=H1(num,17);
    }
    else if(n==2)
    {
      key=H2(num,0.618033,17);
    }
    else
    {
      key=H3(num,701,17);
    }
      if(Table[key].Search(num)!=0)
      {
        return key+1;
      }
      else
        return -1;
  }
  void Print(int num)
  {
    int i;
    for(i=0;i<num;i++)
    {
      if(Table[i].IsEmpty())
        continue;
      Table[i].Print(i);
    }
  }
};

main.h

#include"Hash.h"
int main()
{
  Hash hash(1000),ha(100),sh(100);
  int a[15]={15,6,9,4,7,32,569,419,78,125,635,46,456,16,457};
  int i;
  for(i=0;i<15;i++)
  {
    hash.Insert(a[i],1);
  } 

  for(i=0;i<15;i++)
  {
    ha.Insert(a[i],2);
  }
  cout<<endl;
  for(i=0;i<15;i++)
  {
    sh.Insert(a[i],3);
  }
  hash.Print(1000);
  cout<<endl;
  ha.Print(100);
  cout<<endl;
  sh.Print(100);
  cout<<endl;
  cout<<hash.Search(46,1)<<endl;
  if(hash.Delete(125,1))
  {
    cout<<hash.Search(125,1)<<endl;
  }
}

以上就是C++实现哈希表的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++ 中cerr和cout的区别实例详解

    C++ 中cerr和cout的区别实例详解 前言: cerrThe object controls unbuffered insertions to the standard error output as a byte stream. Once the object is nstructed, the expression cerr.flags & unitbuf is nonzero. Example // iostream_cerr.cpp // compile with: /EHsc /

  • C++中继承与多态的基础虚函数类详解

    前言 本文主要给大家介绍了关于C++中继承与多态的基础虚函数类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 虚函数类 继承中我们经常提到虚拟继承,现在我们来探究这种的虚函数,虚函数类的成员函数前面加virtual关键字,则这个成员函数称为虚函数,不要小看这个虚函数,他可以解决继承中许多棘手的问题,而对于多态那他更重要了,没有它就没有多态,所以这个知识点非常重要,以及后面介绍的虚函数表都极其重要,一定要认真的理解~ 现在开始概念虚函数就又引出一个概念,那就是重写(覆

  • C/C++实现控制台输出不同颜色字体的方法

    本文实例讲述了C/C++实现控制台输出不同颜色字体的方法.分享给大家供大家参考,具体如下: 在控制台输出不同颜色的字 效果 代码: #include "stdio.h" #include "windows.h" int main(int argn, char **argv) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN); printf("Hello&q

  • C++面向对象之多态的实现和应用详解

    前言 本文主要给大家介绍的是关于C++面向对象之多态的实现和应用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 多态 大家应该都听过C++三大特性之一多态,那么什么多态呢?多态有什么用?通俗一点来讲-> 多态性可以简单地概括为"一个接口,多种方法",程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念.当多态应用形参类型的时候,可以接受更多的类型.当多态用于返回值类型的时候,可以返回更多类型的数据.多态可以让你的代码拥有更好的扩展性. 多态分

  • 关于C++的强制类型转换浅析

    前言 一说起强制类型转换大家都很熟悉,相信很多学习完C++的朋友还在使用C语言的强制类型的方式 (类型)变量. C++其实也具有自己的一套强制类型转换它们分明是:static_cast  reinterpret_cast  const_cast  dynamic_cast四种类型. 那么肯定会有人好奇C++是不是闲,C语言的强制类型用的舒舒服服的,为什么要新推出来这几个? 新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换.C++中风格是static_cast<typ

  • 关于C++中void*的小作用浅析

    本文主要给大家分享了关于C++中void*的一些你可能不了解的小作用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 先来看一段代码: #include <iostream> #include <string> using namespace std; void o(int* x, void* y){ cout << *x << endl; cout << x << endl; cout << *(int

  • Go语言到底有没有引用传参(对比 C++ )

    C++ 中三种参数传递方式 值传递: 最常见的一种传参方式,函数的形参是实参的拷贝,函数中改变形参不会影响到函数外部的形参.一般是函数内部修改参数而又不希望影响到调用者的时候会采用值传递. 指针传递 形参是指向实参地址的一个指针,顾名思义,在函数中对形参指向的内容操作,实参本身会被修改. 引用传递 在 C++ 中,引用是变量的别名,实际上是同一个东西,在内存中也存在同一个地址.换句话说,不管在哪里对引用操作,都相当直接操作被引用的变量. 下面看 demo: #include <iostream>

  • C++ 实现哈希表的实例

    C++ 实现哈希表的实例 该散列表的散列函数采用了除法散列函数.乘法散列函数.全域散列函数,每一个槽都是使用有序单向链表实现. 实现代码: LinkNode.h #include<iostream> using namespace std; class Link; class LinkNode { private: int key; LinkNode* next; friend Link; public: LinkNode():key(-1),next(NULL){} LinkNode(int

  • js实现HashTable(哈希表)的实例分析

    一.javascript哈希表简介 javascript里面是没有哈希表的,一直在java,C#中有时候用到了这一种数据结构,javascript里面若没有,感觉非常不顺手.细细看来,其实javascript的object的属性其实与哈希表非常类似. 如: var person = {}; person["name"] = "关羽"; 我们只需要在其基础上再封装一些HashTable的函数,就能够得到一个精简版的哈希表. 加入函数如下: 函数名 说明 返回值 add

  • JS模拟实现哈希表及应用详解

    本文实例讲述了JS模拟实现哈希表及应用.分享给大家供大家参考,具体如下: 在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关js实现哈希表并给出解决实际问题的例子. 说明: 这篇文章所写并不是真正意义的哈希表,只是与哈希表的使用有相似之处. 第一部分:相关知识点 属性的枚举: var person = { name: "zzw", sex: "Male", age: 21 }; for (var prop in person

  • C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)

    本文实例讲述了C#中哈希表(HashTable)用法.分享给大家供大家参考,具体如下: 1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的值.Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键

  • Powershell使用嵌套哈希表实例 嵌套哈希表的2种写法例子

    嵌套哈希表对于多维数组是一个更好选择.这种存储方式将更易于管理.请看: 复制代码 代码如下: $person = @{} $person.Name = 'Weltner' $person.Id = 12 $person.Address = @{} $person.Address.Street = 'Canyon Rim' $person.Address.City = 'Folsom' $person.Address.Details = @{} $person.Address.Details.St

  • C#使用foreach遍历哈希表(hashtable)的方法

    本文实例讲述了C#使用foreach遍历哈希表(hashtable)的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collection; namespace HashSampleApplication1 { class Program { static void Main() { Hashtable hash = new Hashtable(); hashtable[1] = "kaka"; hashtable[2] = &qu

  • php内核解析:PHP中的哈希表

    PHP中使用最为频繁的数据类型非字符串和数组莫属,PHP比较容易上手也得益于非常灵活的数组类型. 在开始详细介绍这些数据类型之前有必要介绍一下哈希表(HashTable). 哈希表是PHP实现中尤为关键的数据结构. 哈希表在实践中使用的非常广泛,例如编译器通常会维护的一个符号表来保存标记,很多高级语言中也显式的支持哈希表. 哈希表通常提供查找(Search),插入(Insert),删除(Delete)等操作,这些操作在最坏的情况下和链表的性能一样为O(n). 不过通常并不会这么坏,合理设计的哈希

  • C#中哈希表(Hashtable)的介绍及简单用法

    key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的值.Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对 <BR><BR><BR>在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value); 在哈希表中去除某个key/value键值对:HashtableObject.Remove(key); 从哈希表中移除所有元素

  • Java 集合框架掌握 Map 和 Set 的使用(内含哈希表源码解读及面试常考题)

    目录 1. 搜索 1.1 场景引入 1.2 模型 2. Map 2.1 关于 Map 的介绍 2.2 关于 Map.Entry<K, V> 的介绍 2.3 Map 的常用方法说明 2.4 关于 HashMap 的介绍 2.5 关于 TreeMap 的介绍 2.6 HashMap 和 TreeMap 的区别 2.7 Map 使用示例代码 3. Set 3.1 关于 Set 的介绍 3.1 Set 的常用方法说明 3.3 关于 TreeSet 的介绍 3.4 关于 HashSet 的介绍 3.5

  • 利用Python循环(包括while&for)各种打印九九乘法表的实例

    一.for循环打印九九乘法表 #注意:由于缩进在浏览器不好控制,请大家见谅,后续会有图片传入. 1.1 左下角 for i in range(1,10): for j in range(1,i+1): print('%d*%d=%2d\t'%(j,i,i*j),end='') print() 效果图: 1.2 右下角 for i in range(1,10): for k in range(i+1,10): print(end=' ') #此处为返回八个空格,请注意 for j in range

随机推荐