zoukankan      html  css  js  c++  java
  • 哈希表(链地址法插入删除)

    与开放地址法思想不同,它不用再次寻找数组位置,采用链表方式存储重复的位置

    //链表结点
    public class Link {
        private int iData;//节点数据
        public Link next;//当前节点的连接节点
        public Link(int it) {
            iData=it;
        }
        public int getKey() {
            return iData;
        }
        public void displayLink() {
             System.out.print(iData+" ");
        }
    
    }
    //有序链表
    public class SortedList {
        private Link first;
        public SortedList() {
            first=null;
        }
        //插入
        public void insert(Link theLink) {
            int key=theLink.getKey();//当前节点的数值
            Link previous=null;//存储前一个节点
            Link current=first;//存储当前节点
            while(current!=null && key>current.getKey()) {//数据是从左到右依次降低
                //向后找位置
                previous=current;//previous存储当前非目的节点
                current=current.next;//current存储当前非目的节点的下一个节点
                
            }
            if(previous==null) {//说明插入的位置是第一个
                first=theLink;
                
            }else previous.next=theLink;//如果不是第一个,就是这样插入链表的
            theLink.next=current;//上面与这一步一起完成插入操作
        }
        //删除
        public void delete(int key) {
            Link previous=null;
            Link current=first;
            while(current!=null && key!=current.getKey()) {
                previous=current;
                current=current.next;
            }
            if(previous==null)
                first=first.next;
            else
                previous.next=current.next;
            
        }
        //查找
        public Link find(int key) {
            Link current=first;
            while(current!=null && current.getKey()<=key) {
                if(current.getKey()==key) {
                    return current;//找到了
                }
                current=current.next;
                
            }
            return null;
        }
        //显示链表
        public void displayList() {
            System.out.print("显示:");
            Link current=first;
            while(current!=null) {
                current.displayLink();
                current=current.next;
            }
            System.out.println();
        }
    
    }
    //哈希表
    public class HashTable {
        private SortedList[] hashArray;//数组
        private int arraySize;//哈希表的大小
        public HashTable(int size) {//初始化
            arraySize=size;
            hashArray=new SortedList[arraySize];
            //给每一个链表初始化
            for(int j=0;j<arraySize;j++) {
                hashArray[j]=new SortedList();
            }
        }
        //打印
        public void displayTable() {
            System.out.print("table:");
            for(int j=0;j<arraySize;j++) {
                System.out.print(j+" ");
                hashArray[j].displayList();//显示j位置的链表
            }
                
        }
        //哈希化
        public int hashFunc(int key) {
            return key%arraySize;
        }
        //插入
        public void insert(Link theLink) {
            int key=theLink.getKey();
            int hashVal=hashFunc(key);//哈希化
            //链地址法插入
            hashArray[hashVal].insert(theLink);
            
                
            
        }
        //删除
        public void delete(int key) {
            int hashVal=hashFunc(key);
            hashArray[hashVal].delete(key);
        }
        //查找
        public Link find(int key) {
            int hashVal=hashFunc(key);
            Link theLink=hashArray[hashVal].find(key);
            return theLink;
        }
        
        
        
        
        
        
        
        
        
        
        
        
    
        
        
    
    }
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Test {
        public static void main(String [] agrs) throws IOException {
            Link aDataItem;
            int akey,size,n,keysPerCell=100;
            System.out.print("Enter:");
            size=getInt();
            System.out.println("初始化:");
            n=getInt();
            keysPerCell=10;
            HashTable theHashTable=new HashTable(size);
    for(int j=0;j<n;j++) {
                akey=(int)(java.lang.Math.random()*keysPerCell*size);
                aDataItem=new Link(akey);
                theHashTable.insert(aDataItem);
            }
            while(true) {
                System.out.print("Enter first of show,isnert,delete ,find:");
                char choice=getChar();
                switch(choice){
                    case 's':
                        theHashTable.displayTable();
                        break;
                    case 'i':
                        System.out.print("insert:");
                        akey=getInt();
                        aDataItem=new Link(akey);
                        theHashTable.insert(aDataItem);
                        break;
                    case 'd':
                        System.out.println("输入要删除的key");
                        akey=getInt();
                        theHashTable.delete(akey);
                        break;
                    case 'f':
                        System.out.println("输入要查找的key");
                        akey=getInt();
                        aDataItem=theHashTable.find(akey);
                        if(aDataItem!=null)
                            System.out.println("found"+akey);
                        else
                            System.out.println("没有找到");
                        break;
                        default:
                            System.out.println("无效的输入");
                }
            }
            
            
            
        }
        public static String getString() throws IOException{
            InputStreamReader isr=new InputStreamReader(System.in);
            BufferedReader br=new BufferedReader(isr);
            return br.readLine();
        }
        public static char getChar() throws IOException{
            return getString().charAt(0);
        }
        public static int getInt() throws IOException{
            return Integer.parseInt(getString());
        }
    
    }
  • 相关阅读:
    《Mysql
    《算法
    《Redis
    《Mysql
    《Mysql
    SSH免密码登录
    TCP/IP四层模型和OSI七层模型的概念
    简单描述RAID级别:
    awk内置变量 awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
    awk 的逻辑运算字符
  • 原文地址:https://www.cnblogs.com/S-Mustard/p/7724060.html
Copyright © 2011-2022 走看看