数据结构——哈希表的构造和查找

#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 25
#define P 13
#define OK 1
#define ERROR 0
#define DUPLICATE -1
#define TRUE 1
#define FALSE 0
typedef struct   /*哈希表元素结构*/
{
    int key;  /*关键字值*/
    int flag; /*是否存放元素*/
} ElemType;

typedef struct
{
    ElemType data[MAXSIZE];
    int count;      /*元素个数*/
    int sizeindex;  /*当前哈希表容量*/
} HashTable;

int d1[15]= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; /*线性探测序列*/
int d2[15]= {0,1,-1,2*2,-2*2,3*3,-3*3,4*4,-4*4,5*5,-5*5,6*6,-6*6,7*7,-7*7}; /*二次探测序列*/
void dataset(int ds[],int *len);
int InsertHash(HashTable *H,int e,int d[]);
int CreateHash(HashTable *H,int ds[],int len,int d[]);
int SearchHash(HashTable *H, int e,int d[]);
void menu();
/*输入查找表*/
void dataset(int ds[],int *len)
{
    int n,m;
    n=0;
    printf("\n查找表输入:");
    while(scanf("%d",&m)==1)   /*以输入一个非整数作为结束*/
    {
        ds[n]=m;
        n++;
    }
    *len=n;
}
/*计算哈希地址,插入哈希表*/
int InsertHash(HashTable *H,int e,int d[])
{
    int k,i=1;
    k=e%P;
    while(H->data[k].flag==TRUE||k<0)
    {
        k=(e%P+d[i])%MAXSIZE;
        i++;
        if(i>=15)
            return ERROR;
    }
    H->data[k].key=e;
    H->data[k].flag=TRUE;
    H->count++;
    return OK;
}
/*构造哈希表*/
int CreateHash(HashTable *H,int ds[],int len,int d[])
{
    int i;
    for(i=0; i<len; i++)
    {
        if(SearchHash(H,ds[i],d)!=-1)
            return DUPLICATE;
        InsertHash(H,ds[i],d);
        if(H->count>=MAXSIZE)
            return ERROR;
    }
    return OK;
}
/*初始化哈希表*/
void InitHash(HashTable *H)
{
    int i;
    for(i=0; i<MAXSIZE; i++)
    {
        H->data[i].key=0;
        H->data[i].flag=FALSE;
    }
}
/*在哈希表中查找*/
int SearchHash(HashTable *H, int e,int d[])
{
    int k,i=1;
    k=e%P;
    while(H->data[k].key!=e)
    {
        k=(e%P+d[i])%MAXSIZE;
        i++;
        if(i>=15)
            return -1;
    }
    return k;
}
/*演示菜单*/
void menu()
{
    int choice;
    int *p;
    HashTable h;
    h.count=0;
    h.sizeindex=MAXSIZE;
    int a[MAXSIZE]= {0};
    int i,n,e;
    dataset(a,&n);  /*建立查找表*/
    getchar();
    printf("\n");
    do
    {
        printf("\n----哈希查找演示----\n");
        printf("\n1.线性探测构造哈希表\n");
        printf("\n2.二分探测构造哈希表\n");
        printf("\n3.退出\n");
        printf("\n输入选择:");
        scanf("%d",&choice);
        if(choice==1)
            p=d1;
        else if(choice==2)
            p=d2;
        else
            return;
        InitHash(&h);   /*初始化哈希表*/
        if(!(i=CreateHash(&h,a,n,p))) /*构造哈希表*/
            printf("\n哈希表构造失败!\n");
        else if(i==DUPLICATE)
            printf("\n哈希表具有重复关键字!\n");
        else
        {
            printf("\n哈希表:\n");
            for(i=0; i<h.sizeindex; i++)
                printf("%3d",h.data[i].key);
            printf("\n\n哈希查找\n输入要查找的key值:");
            getchar();
            scanf("%d",&e);
            if((i=SearchHash(&h,e,p))==-1)
                printf("\n%d未找到\n",e);
            else
                printf("\n%d在哈希表中下标为%d\n",e,i);
        }
        getchar();
    }
    while(1);
}

int main()
{
    menu();
    return 0;
}

原文地址:https://www.cnblogs.com/wkfvawl/p/10105097.html

时间: 2024-11-06 13:02:23

数据结构——哈希表的构造和查找的相关文章

数据结构哈希表(转)

数据结构哈希表 参考代码如下: [plain] view plain copy /* 名称:哈希表 语言:数据结构C语言版 编译环境:VC++ 6.0 日期: 2014-3-26 */ #include <stdio.h> #include <malloc.h> #include <windows.h> #define NULLKEY 0   // 0为无记录标志 #define N 10        // 数据元素个数 typedef int KeyType;// 

数据结构---哈希表(散列表)

我们在Java容器中谈到:有哈希表(也称为散列表)支持的HashMap.LinkedHashSet等都具有非常高的查询效率.这其中就是Hash起的作用.顺序查找的时间复杂度为O(N) ,二分查找和查找树的时间复杂度为O(logN),而 哈希表的时间复杂度为O(1) .不过这只是理想状态,实际并不那么完美. 1.哈希表的概念和思想 哈希表是唯一的专用于集合的数据结构.可以以常量的平均时间实现插入.删除和查找. 哈希表的思想是:用一个与集合规模差不多大的数组来存储这个集合,将数据元素的关键字映射到数

数据结构 哈希表 c++

什么是哈希表 理想的查找是不经过任何的比较,一次存取就能得到想要查询的记录:要达到这样的目的就需要在记录的储存位置和它的关键字之间建立一个确定的关系f , 让每个关键字和结构中的一个唯一的地址相对应.在查找的时候,只需要对应关系f找到给定值K的像f(K),若结构中存在关键字和K相等,则必定在f(K)的储存位置上,由此不需要任何比较就能得到查询: 就好像数组一样,我们要找第一个数,调用a[0]就能得到第一个数, 当我们通过关键字来找的时候,通过一定的规则,把关键字和储存位置建立一个映射,就能通过数

数据结构 - 哈希表

哈希表 1. 哈希表的引入 1.1 哈希表的简单概述   哈希表一个通过哈希函数来计算数据存储位置的数据结构,通常支持如下操作 (高效的操作):python中的字典是通过哈希表实现的 insert(key, value):插入键值对(key,value) get(key):如果存在键为key的键值对则返回其value,否则返回空值 delete(key):删除键为key的键值对  1.2.直接寻址表 当关键字的key 的 全域U(关键字可能出现的范围)比较小时,直接寻址是一种简单而有效的方法 存

Java数据结构——哈希表

什么是哈希表?哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方. 哈希表充分体现了算法设计领域的经典思想:空间换时间.哈希表是时间和空间之间的平衡.其中的哈希函数是最重要的,“键”通过哈希函数得到的“索引”分布越均匀越好.但是哈希表会失去顺序性. 哈希函数的设计对于整型 小范围正整数直接使用 小范围负整数进行偏移 -100~100 ----> 0~200 大整数:模一个素数 对于浮点型转成整型处理 对于字符串也是转成整型处理 int hash=0: f

java数据结构——哈希表(HashTable)

哈希表提供了快速的插入操作和查找操作,每一个元素是一个key-value对,其基于数组来实现. 一.Java中HashMap与Hashtable的区别: HashMap可以接受null键值和值,而Hashtable则不能. Hashtable是线程安全的,通过synchronized实现线程同步.而HashMap是非线程安全的,但是速度比Hashtable快. 这两个类有许多不同的地方,下面列出了一部分: a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的.

数据结构哈希表的闭散列基本实现

#pragma once #include<string> using namespace std; enum Status//表示当前位置的状态 { EXITS, DELETE, EMPTY, }; template<class K,class V> struct KeyValueNode//KV键值对 { K _key; V _value; KeyValueNode(const K& key=K(), const V& value=V()) :_key(key)

数据结构---哈希表(KV模式)(除留余数法)

可以实现快速定位查找数据 思想一:开一个适当大小的数组,讲需要存入的数据%上数组的_capacity的到的数作为他存放的位置,如果这个位置被占了,则在他的下一个位置存放数据(不会找不到空位置,下面会说到). 思想二:存放在数组上的是一个结构体,结构体包含一个索引值Key,存储值Value,和一个存储状态(枚举类型,EXIST,EMPTY,DELETE)可以使用这三种状态进行判断和懒人删除法(不用清除数据,设置为DELETE状态即可). 思想三:开辟空间的问题,初始空间经过资料查询,开一个大小为5

【哈希表】CODEVS1230 元素查找

#include<cstdio> #include<vector> using namespace std; typedef vector<int>::iterator VER; #define MOD 100007 vector<int>v[MOD]; int n,m,t; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) { scanf("%