哈希函数

设哈希表长为18,哈希函数为: H(k)=k MOD 17 建立对应的哈希表。采用开放地址法中的二次探测再散列解决冲突,完成以下工作:
(1)查找值为x的元素地址(位置)。找不到则输出-1。
(2)删除关键字为t1、t2的元素,再添加关键字为y的元素
(3)输出整个哈希表(用%4d格式,没有数据则输出4个*)

输入格式:
输入分2部分,
第一部分是初始元素个数和序列
第二部分是x、t1、t2、y的值,分3行输入。

输出格式:
输出数据共2行
第一行是x的地址 第二行是最后的哈希表

输入样例:
12
16 74 60 43 54 90 46 31 29 88 77 26
77
77 90
98
输出样例:
8
26******** 54 88**** 74******** 60 43**** 46 29 31**** 16 98

#include<stdio.h>
#include<stdlib.h>

#define HASHSIZE 18
#define NULLKEY -1
typedef struct
{
    int *elem;
    int count;
} HashTable;
int m=1,t=1;
//初始化散列表
int InitHashTable(HashTable &H,int len)
{
    int i;
    H.count=0;
    H.elem=(int*)malloc(HASHSIZE*sizeof(int));
    for(i=0; i<18; i++)
    {
        H.elem[i]=NULLKEY;
    }
    return 1;
}
//散列函数
int Hash(int key)
{
    return key%17;
}
int collision(HashTable &H,int p)
{

    int i;
    int location;
    for(i=1; i<9; i++)
    {
        location=(p+i*i)%18;
        if(H.elem[location]==NULLKEY)
            return location;
        location=p-i*i;
        while(location<0)
            location+=18;
        location=location%18;
        if(H.elem[location]==NULLKEY)
            return location;
    }
    return -1;
}
//插入关键字进散列表
void InsertHash(HashTable &H,int key)
{
    int addr=Hash(key);

    while(H.elem[addr]!=NULLKEY)
    {
        addr=collision(H,addr);

    }
    //printf("%d ",addr);
    H.elem[addr]=key;
    H.count++;
}
//查找指定元素
int SearchHash(HashTable H,int key,int &addr)
{
//    bool flag=0;
//    for(int i=0; i<18; i++)
//    {
//        if(H.elem[i]==key)
//        {
//            flag=1;
//            printf("%d",i);
//            return 0;
//        }
//    }
//    if(!flag)
//        printf("-1");
    addr=Hash(key);
    int p;
    p=addr;
    if(H.elem[addr]!=key&&H.elem[addr]!=NULLKEY)
    {
        int i;
        int location;
    for(i=1; i<9; i++)
    {
        location=(p+i*i)%18;
        if(H.elem[location]==key)
            {
                addr=location;
                //return 1;
            }
        location=p-i*i;
        while(location<0)
            location+=18;
        location=location%18;
        if(H.elem[location]==key)
            {
                addr=location;
                //return 1;
            }
    }
    }
    if(H.elem[addr]==key)
        return 1;
    else
        return 0;
}
void DeleteHash(HashTable &H,int len,int key)
{
    int i;
    for(i=0; i<18; i++)
    {
        if(H.elem[i]==key)
        {
            H.elem[i]=NULLKEY;
            H.count--;
        }
    }
}

int main()
{
    int a[1000];
    HashTable H;
    int i;
    int len;
    scanf("%d",&len);
    InitHashTable(H,len);
    for(i=0; i<len; i++)
        scanf("%d",&a[i]);
    for(i=0; i<len; i++)
    {
        InsertHash(H,a[i]);
    }
    int t;
    scanf("%d",&t);
    int addr;
    int x1,x2;
    scanf("%d%d",&x1,&x2);
    int y;
    scanf("%d",&y);
    if(SearchHash(H,t,addr))
        printf("%d\n",addr);
    else
        printf("-1\n");
    DeleteHash(H,len,x1);
    DeleteHash(H,len,x2);


    InsertHash(H,y);

//    //printf("插入之后的哈希表为:");
    for(i=0; i<18; i++)
    {

        if(H.elem[i]==NULLKEY)
            printf("****");
        else
            printf("%4d",H.elem[i]);

    }
    return 0;

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值