数据结构 c语言实现哈希(hash)表查找 除留余数法构建hash函数开放定值法线性探测处理冲突

来源:互联网 发布:中小型企业网络搭建 编辑:程序博客网 时间:2024/06/04 18:08

一.hash函数头文件实现hash.h

#ifndef __HASH_H__
#define __HASH_H__
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<unistd.h>
#define N 11

typedef int datatype;
typedef struct hastbl
{
    datatype *h;
    int length;
}hash_tbl,*hash_tp;

extern void init_hash(hash_tp *hp,int m);
extern void create_hash(hash_tp hp,datatype *a);
extern int hash_search(hash_tp hp,int key);
extern void hash_show(hash_tp hp,int hash_val);
#endif

二.hash函数函数实现hash.c

#include"hash.h"
int p;

void init_hash(hash_tp *hp,int m)
{
    (*hp) = malloc(sizeof(hash_tbl));
    if(NULL == *hp)
    {
        perror("malloc");
        exit(1);
    }
    (*hp)->length = m;
    (*hp)->h =(datatype*)malloc((*hp)->length * sizeof(datatype));
    if(NULL == (*hp)->h)
    {
        perror("malloc");
        exit(1);
    }
    for(int i = 0;i <(*hp)->length;i++)
        (*hp)->h[i] = -1;
}
int fun(int m)
{
    int i;
    for(;m > 1;m--)
    {
        for(i = 2;i < m;i++)
        {
            if(m % i == 0)//求质数
                break;
        }
        if(i >= m)
            return m;
    }
    return -1;
}
void create_hash(hash_tp hp,datatype *a)
{
    int hash_val,i;
    p = fun(hp -> length);
    if(p == -1)
        exit(1);
    for(i = 0;i < N;i++)
    {
        //1.用除留余数法构建hash函数
        hash_val = a[i] % p;
        //2.用线性探查法处理冲突
        while(hp->h[hash_val] != -1)
            hash_val = (hash_val +1)%hp ->length;
        //3.将记录存储在hash_val的位置
        hp->h[hash_val] = a[i];
        hash_show(hp,hash_val);
        sleep(1);
    }

}
int hash_search(hash_tp hp,int key)
{
    int hash_val,flag = 0;
    hash_val = key % p;//用除留余数法得到hash地址
    while(hp -> h[hash_val] != key)
    {
        hash_val = (hash_val + 1) % hp->length;
        flag++;
        if(flag == hp->length)
            return -1;
    }
    return hash_val;
}
void hash_show(hash_tp hp,int hash_val)
{
    int i;
    for(i = 0;i < hp->length;i++)
    {
        if(i == hash_val)
            printf("hp->h[%02d]:%d<---当前插入\n",i,hp->h[i]);
        else
            printf("hp->h[%02d]:%d\n",i,hp->h[i]);
    }
    printf("***************************************");
}

三.主函数包含main的test文件

 #include"hash.h"

int main()
{
    hash_tp hp;
    int m,i,key;
    char ch;
    datatype a[N] = {23,34,14,38,46,16,68,15,7,31,26};
    //1.根据记录个数得到hash表的长度
    m =(int) ceil(N/0.75); //向下取整
    //2,初始化哈系表空间
    init_hash(&hp,m);
    //3.创建hash表
    create_hash(hp,a);
    //4.hash表查找
    while(1)
    {
        printf("pls input key");
        scanf("%d",&key);
        i = hash_search(hp,key);
        if(i == -1)
        {
            printf("search error!\n");
        }
        else
        {
            printf("search %d at %d\n",key,i);
        }
        printf("continue?(Y/y)");
        while(getchar() != '\n');
        scanf("%c",&ch);
        if(ch == 'y' || ch == 'Y')
            continue;
        else
            break;
    }

    return 0;
}

四.makefile文件

CC = gcc                                                
CFLAGS= -Wall -g -O0


test:hash.c test.c
        $(CC) $(CFLAGS) -o $@ $^
clean:
        $(RM) hash_search .*.sw?
                                                        
                                                        
                                                        
                                                        
                                                        
                                                        



阅读全文
0 0