设哈希表长为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;
}