以下代码以数组存储方式实现了哈希表的创建,查找,插入,删除等操作,哈希函数采用除留余数法,使用开放定址法中的线性探查法处理冲突
public class HashSearch {
/*使用数组实现hashtable的创建,查找,插入,删除*/
class Node{ //结点内部类表示hashtable中存储的元素
int key; //数据域
boolean delflag; //在删除时使用,作为删除标志
int times; //比较次数
public Node(int data){
key=data;
delflag=false;
times=0;
}
}
public int Collision(int d,int hashsize){
/*线性探查法处理冲突,hashsize表示HashTable的大小*/
return (d+1)%hashsize;
}
public int HashFunc(int key,int hashsize){
/*采用除留余数法构造哈希函数*/
return key%hashsize;
}
/*hashtable的查找*/
public int Hashsearch(Node[]HashTable,int x){
/*HashTable为哈希表数组,x为待查找的元素*/
/*找到,则返回哈希地址;没找到返回负的哈希地址*/
int addr;
int hashsize=HashTable.length;
addr=HashFunc(x,hashsize); //获得哈希地址
while(HashTable[addr]!=null && HashTable[addr].key!=x){
addr=Collision(addr,hashsize); //没找到,处理冲突
}
if(HashTable[addr]!=null && HashTable[addr].key==x) //查找成功
return addr;
else return -addr; //查找失败
}
/*哈希表的插入*/
public int HashInsert(Node[]HashTable,int x){
int addr;
addr=Hashsearch(HashTable,x); //在哈希表中查找
if(addr>0) return 0; //找到则不必插入
HashTable[-addr]=new Node(x); //没找到,则插入
HashTable[-addr].times=1; //设置比较次数
return 1; //插入成功
}
/*哈希表的创建*/
public void CreateHash(Node[]HashTable,int items[]){
/*利用所给关键字的序列items,创建哈希表,n为关键字的个数*/
int hashsize=HashTable.length;
int n=items.length;
int i;
for(i=0;i<hashsize;i++){ //初始化哈希表
HashTable[i]=null;
}
for(i=0;i<n;i++){
HashInsert(HashTable,items[i]); //依次向哈希表中插入元素
}
}
/*哈希表的删除*/
public int HashDelete(Node[]HashTable,int x){
int addr;
addr=Hashsearch(HashTable, x); //查找数据元素
if(addr>0){
HashTable[addr].delflag=true; //找到,则设置删除标记为true
return 1;
}
return 0;
}
/*哈希表的显示*/
public void Displayhash(Node[]HashTable){
int i,hashsize=HashTable.length;
System.out.print("哈希表\n哈希地址:");
for(i=0;i<hashsize;i++){
System.out.print(i+" ");
}
System.out.print("\n关键字: ");
for(i=0;i<hashsize;i++){
if(HashTable[i]!=null && HashTable[i].delflag==false){
if(HashTable[i].key<10)
System.out.print(HashTable[i].key+" ");
else System.out.print(HashTable[i].key+" ");
}
else System.out.print(","+" ");
}
}
public static void main(String[] args) {
int []items=new int[]{15,59,22,34,7,78};
Node[] HashTable=new Node[7];
HashSearch hs=new HashSearch();
hs.CreateHash(HashTable, items);
hs.Displayhash(HashTable);
int addr;
addr=hs.Hashsearch(HashTable, 59);
System.out.println("\n"+addr);
hs.HashDelete(HashTable, 34);
hs.Displayhash(HashTable);
}
}