全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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++实现哈希表的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++  # 实现哈希表  # 哈希表的实现实例  # 详解哈希表  # C++数据结构哈希表详解  # C++深入探究哈希表如何封装出unordered_set和unordered_map  # C++哈希表之线性探测法实现详解  # C++中使用哈希表(unordered_map)的一些常用操作方法  # C++基础算法基于哈希表的索引堆变形  # C++ 哈希表的基本用法及说明  # 都是  # 链表  # 如有  # 希望能  # 采用了  # 谢谢大家  # 疑问请  # num  # nbsp  # return  # Getkey  # friend  # key  # NULL  # public  # Hash  # delete  # void  # Insert  # GetLength 


相关文章: 阿里云网站制作公司,阿里云快速搭建网站好用吗?  建站主机CVM配置优化、SEO策略与性能提升指南  重庆市网站制作公司,重庆招聘网站哪个好?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  建站之星如何优化SEO以实现高效排名?  三星网站视频制作教程下载,三星w23网页如何全屏?  常州企业网站制作公司,全国继续教育网怎么登录?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  潮流网站制作头像软件下载,适合母子的网名有哪些?  北京企业网站设计制作公司,北京铁路集团官方网站?  香港服务器部署网站为何提示未备案?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何高效搭建专业期货交易平台网站?  实现虚拟支付需哪些建站技术支撑?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  简单实现Android文件上传  建站主机解析:虚拟主机配置与服务器选择指南  如何选择CMS系统实现快速建站与SEO优化?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  黑客如何利用漏洞与弱口令入侵网站服务器?  制作企业网站建设方案,怎样建设一个公司网站?  如何登录建站主机?访问步骤全解析  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何确认建站备案号应放置的具体位置?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何通过云梦建站系统实现SEO快速优化?  如何用免费手机建站系统零基础打造专业网站?  建站之星安装需要哪些步骤及注意事项?  建站之星导航如何优化提升用户体验?  孙琪峥织梦建站教程如何优化数据库安全?  h5网站制作工具有哪些,h5页面制作工具有哪些?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  网站微信制作软件,如何制作微信链接?  网站制作价目表怎么做,珍爱网婚介费用多少?  C++时间戳转换成日期时间的步骤和示例代码  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  建站VPS配置与SEO优化指南:关键词排名提升策略  建站之星2.7模板:企业网站建设与h5定制设计专题  如何通过wdcp面板快速创建网站?  C#如何在一个XML文件中查找并替换文本内容  建站之星后台密码遗忘或太弱?如何重置与强化?  建站之星24小时客服电话如何获取?  如何在七牛云存储上搭建网站并设置自定义域名?  建站主机类型有哪些?如何正确选型  建站之星如何快速生成多端适配网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。