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

Posted wkfvawl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构——哈希表的构造和查找相关的知识,希望对你有一定的参考价值。

 

 

 

#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("
查找表输入:");
    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("
");
    do
    {
        printf("
----哈希查找演示----
");
        printf("
1.线性探测构造哈希表
");
        printf("
2.二分探测构造哈希表
");
        printf("
3.退出
");
        printf("
输入选择:");
        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("
哈希表构造失败!
");
        else if(i==DUPLICATE)
            printf("
哈希表具有重复关键字!
");
        else
        {
            printf("
哈希表:
");
            for(i=0; i<h.sizeindex; i++)
                printf("%3d",h.data[i].key);
            printf("

哈希查找
输入要查找的key值:");
            getchar();
            scanf("%d",&e);
            if((i=SearchHash(&h,e,p))==-1)
                printf("
%d未找到
",e);
            else
                printf("
%d在哈希表中下标为%d
",e,i);
        }
        getchar();
    }
    while(1);
}

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

 技术分享图片

技术分享图片

 

以上是关于数据结构——哈希表的构造和查找的主要内容,如果未能解决你的问题,请参考以下文章

哈希算法和哈希表的区别?

Python数据结构系列☀️《查找排序-基础知识》——知识点讲解+代码实现☀️

哈希表与哈希(Hash)算法

哈希表的简单操作

查找:哈希表

hash表原理