题目描述
采用除留余数法(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);
}