#include<iostream>
#include<iomanip>
using namespace std;

typedef struct Node
{
 int data;
 struct Node *next;
}node;

int len,num,M,numbers,i=0,mod,count=0;
int *a;
node **p,*s;
float ASL=0,ASL1=0;

int ListLength(node * head)
{
 int length=0;
 node *p;
 p=head;
 while(p)
 {
  length++;
  p=p->next;
 }
 return length;
}

void Insert(node * &head,node * s)
{
 node *p;
 p=head;
 while(p->next)
 {
  p=p->next;
 }
 p->next=s;
}

void Print(node * head)
{
 node *p;
 p=head;
 while(p)
 {
  cout<<"->"<<p->data;
  p=p->next;
 }
}

void f1()
{
 cout<<"Input HashTable address length:";
 cin>>len;
 cout<<"Input the value of M in Hash function H(k)=k%M:";
 cin>>M;
 a=new int[len];
 cout<<"Input the number of data to be hashed into the hash table:";
 cin>>numbers;
 for(i=0;i<len;i++)
 {
  a[i]=-1;
 }
    cout<<"please input the keys:";
    for(i=1;i<=numbers;i++)
 {
  cin>>num;
  mod=num%M;
  if(a[mod]==-1)
  {
  a[mod]=num;
  ASL+=1;
  }
  else
  {
   while(a[(++mod)%len]!=-1)
   {
    count++;
   }
   a[mod]=num;
   ASL+=(count+2);
  }
 }

for(i=0;i<len;i++)
 {
  count=0;
  if(a[i]==-1)
   ASL1+=0;
  else
  {
   int j=i;
   while(a[(++j)%len]!=-1)
   {
    count++;
   }
   ASL1+=(count+1);
  }
 }
 cout<<"the hash table is as followed:"<<endl<<endl;
 cout<<"HashAddress";
 for(i=0;i<len;i++)
 {
  cout<<setw(4)<<i;
 }
 cout<<endl;
 cout<<"    Key    ";
 for(i=0;i<len;i++)
 {
  if(a[i]==-1)
   cout<<setw(4)<<'\0';
  else
      cout<<setw(4)<<a[i];
 }
 cout<<endl<<endl;
 cout<<"Hash search successfully using linear detection method to resolve conflicts and the average search length ASL is:";
 cout<<(float)ASL/numbers<<endl;
 cout<<"Hash search unsuccessfully using linear detection method to resolve conflicts and the average search length ASL is:";
 cout<<(float)ASL1/len<<endl;
}

void f2()
{
 cout<<"input HashTable address length:";
 cin>>len;
 p=new node*[len];
 cout<<"Input the value of M in Hash function H(k)=k%M:";
 cin>>M;
 cout<<"Input the number of key to be hashed into the hash table:";
 cin>>numbers;
 for(i=0;i<len;i++)
 {
  p[i]=NULL;
 }
 cout<<"please input the keys:";
 for(i=0;i<numbers;i++)
 {
  cin>>num;
  mod=num%M;
  if(p[mod]==NULL)
  {
   p[mod]=new node;
   p[mod]->data=num;
   p[mod]->next=NULL;
   ASL+=1;
  }
  else
  {
   s=new node;
   s->data=num;
   s->next=NULL;
   Insert(p[mod],s);
   ASL+=ListLength(p[mod]);
  }
 }
 for(i=0;i<len;i++)
 {
  if(p[i]==NULL)
   ASL1+=0;
  else
   ASL1+=ListLength(p[i]);
 }
 cout<<"the hash table is as followed:"<<endl<<endl;
 for(i=0;i<len;i++)
 {
  cout<<setiosflags(ios::left)<<setw(3)<<i;
  if(p[i]==NULL)
   cout<<'^'<<endl;
  else
  {
   Print(p[i]);
   cout<<endl;
  }
 }
 cout<<endl;   
 cout<<"Hash search successfully using chain address method to resolve conflicts and the average search length ASL is:";
 cout<<(float)ASL/numbers<<endl;
 cout<<"Hash search unsuccessfully using chain address method to resolve conflicts and the average search length ASL is:";
 cout<<(float)ASL1/len<<endl;
}

void main()
{
    int choice;
 cout<<"1.Linear detection and re hash "<<endl;
 cout<<"2.separate chaining "<<endl;
 cout<<"please choose a method to solve the address conflict:";
 cin>>choice;
 system("cls");
 switch(choice)
 {
 case 1:f1();break;
 case 2:f2();break;
 default:cout<<"input error!"<<endl;break;
 }
}

若有不足欢迎指正;若有疑问鄙人也乐于解答,欢迎留言或QQ加群!

欢迎加入QQ群:735472015,群内有VC,MFC,win32API,批处理,python学习资料干货喔

哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现的更多相关文章

  1. DS哈希查找--线性探测再散列

    题目描述 定义哈希函数为H(key) = key%11.输入表长(大于.等于11),输入关键字集合,用线性探测再散列构建哈希表,并查找给定关键字. --程序要求-- 若使用C++只能include一个 ...

  2. 哈希表---线性探测再散列(hash)

    //哈希表---线性探测再散列 #include <iostream> #include <string> #include <stdio.h> #include ...

  3. JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路

    JDK8中的HashMap相对JDK7中的HashMap做了些优化. 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起   ...

  4. GET和POST两种基本请求方法(转自博主--在途中#)

    GET和POST两种基本请求方法的区别 GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过req ...

  5. 转:GET和POST两种基本请求方法的区别

    原文地址:GET和POST两种基本请求方法的区别 原文如下: GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL ...

  6. 表格细边框的两种CSS实现方法

    在网页制作中,细边框这个制作方法是必不可少的.这里介绍2种常见的表格细边框制作方法,均通过XHTML验证. <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

  7. 两种HTTP请求方法:GET和POST的区别

    之前在一些开发者平台使用网页调用API时,一再提到两种请求方法GET和POST,所以就去了解了下.那么这又不得不提到HTTP了! 一.什么是 HTTP? 超文本传输协议(HTTP)的设计目的是保证客户 ...

  8. 修改linux 两种时间的方法

    1,整理了一下怎么修改linux 两种时间的方法. 硬件时间:hwclock 或者clock,设置的方法是 hwclock --set --date="05/12/2018 12:30:50 ...

  9. 哈希表(一):解决hash冲突的几种方法

    (一)线性探测法 线性探测法是最简单的处理冲突的方法. (1)插入元素:插入元素时,如果发生冲突,算法将从该槽位向后遍历哈希表,直到找到表中的下一个空槽,并将该值放入到空槽当中. (2)查找元素:查找 ...

随机推荐

  1. css模仿百度首页

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. easyui window窗口 不垂直居中

    $('#hotelDetailWrap').window({ width: 1040, height: 160, collapsible: false, minimizable: false, max ...

  3. 机智的Popup,带着简单的图表感觉酷酷的

    之前有提过用 InfoTemplate 类对 FeatureLayer 的基本信息进行展示,今天为大家介绍 esri/dijit/Popup 的使用,这东西还有 简单的图表展示功能呢! <!DO ...

  4. 多尺度几何分析(Ridgelet、Curvelet、Contourlet、Bandelet、Wedgelet、Beamlet)

    稀疏基的讨论已经持续了近一个月了,这次讨论多尺度几何分析.但由于下面讨论的这些变换主要面向图像,而本人现在主要关注于一维信号处理,所以就不对这些变换深入讨论了,这里仅从众参考文献中摘抄整理一些相关内容 ...

  5. [PE格式分析] 2.IMAGE_DOS_HEADER

    typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number 固定为"MZ" ...

  6. Linux Mint 18.2安装后需要进行的设置

    自己的笔记本电脑升级到win10后各种不好用,运行速度慢,开关机时间很长,系统也是经常性的更新,外加发热严重.更改设置和更换驱动都没能解决问题.另外感觉在Linux下能够更加专注,所以索性将主系统更换 ...

  7. 关于thrift的一些探索——thrift序列化技术

    thrift的IDL,相当于一个钥匙.而thrift传输过程,相当于从两个房间之间的传输数据. 图-1 (因为Thrift采用了C/S模型,不支持双向通信:client只能远程调用server端的RP ...

  8. QTimer掉坑出坑过程

    最近遇到一个问题,就是关于QTimer设置了10ms,结果不生效,很头疼啊,查了快一天了,终于知道为什么了? 先说下QTimer的使用方法: m_delayHideTimer这是QTimer的对象. ...

  9. Python初学者第九天 字符串、列表、字典练习

    # -*- coding: utf-8 -*-写代码,有如下字典,按要求实现每个功能dic={'k1':'v1','k2':'v2','k3':'v3'}1.请循环遍历出所有的key:dic={'k1 ...

  10. c++11简单的线程

    线程的管理 启动线程 为了让编译器识别 std::thread 类,这个简单的例子也要包含 <thread> 头文件. 如同大多数C++标准库一样 线程在std::thread对象创建(为 ...