1012: 哈希表(链地址法处理冲突)

题目描述
采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法。建立链表的时候采用尾插法。

输入
第一行为哈西表的长度m;
第二行为关键字的个数n;
第三行为关键字集合;
第四行为要查找的数据。

输出
如果查找成功,输出该关键字所在哈希表中的地址和比较次数;如果查找不成功,输出-1。

样例输入

13
13
16 74 60 43 54 90 46 31 29 88 77 78 79
16

样例输出

3,1

题目给的样例输出好像不对,应该是3,2

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MaxSize 1000
typedef struct node
{
    int key;
    struct node *next;
}NodeType;
typedef struct
{
    NodeType*first;
}HashTable;
HashTable ha[MaxSize];//哈希表
int keys[MaxSize];//存键值
void Insert(HashTable ha[],int m,int key)
{
    int adr;
    adr=key%m;//关键字%哈希表长度
    NodeType *q;
    q=(NodeType*)malloc(sizeof(NodeType));
    q->key=key;
    q->next=NULL;
    //通过链接形成某地址的哈希表
    if(ha[adr].first==NULL)
    {
        ha[adr].first=q;
    }else//头插法
    {
        q->next=ha[adr].first;
        ha[adr].first=q;
    }
}
void Seek(HashTable ha[],int m,int k)
{
    int i=0,adr;
    adr=k%m;
    //判断是哪一个地址的哈希表
    NodeType *q;
    q=ha[adr].first;
    //q为当前地址的哈希表的头指针
    while(q!=NULL)
    {
        i++;
        if(q->key==k) break;
        q=q->next;
    }
    if(q!=NULL)
    printf("%d,%d",adr,i);
    else
    printf("-1");
}
int main()
{
    int m,n,k;
    scanf("%d",&m);//哈希表长度
    scanf("%d",&n);//关键字个数
    for(int i=0;i<n;i++)
    {
        scanf("%d",&keys[i]);//关键字集合
    }
    for(int i=0;i<m;i++)
    {
        ha[i].first=NULL;
    }
    for(int i=0;i<n;i++)
    {
        Insert(ha,m,keys[i]);///插入哈希表
    }
    scanf("%d",&k);
    Seek(ha,m,k);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值