java 数组实现哈希表的构建,查找,插入,删除

以下代码以数组存储方式实现了哈希表的创建,查找,插入,删除等操作,哈希函数采用除留余数法,使用开放定址法中的线性探查法处理冲突

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);

    }

}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值