zoukankan      html  css  js  c++  java
  • 重新整理数据结构与算法—— 简单的哈希链表[十五]

    前言

    为什么有这个哈希链表呢?

    首先来看一张图:

    这种就是哈希链表。为什么要这样做呢?

    如果是数组存储的话,存在一个问题,那就是扩容。

    如果是链表的时候,那么存在查询需要遍历整个链表。

    这个哈希链表就是两者的结合。

    正文

    代码如下:

    class HashTab {
    
    private EmpLinkedList[] empLinkedListArray;
    
    private int size;// 数组的长度
    
    public HashTab(int size)
    {
    	this.size = size;
    	empLinkedListArray = new EmpLinkedList[size];
    	for (int i = 0; i < size; i++)
    	{
    		empLinkedListArray[i] = new EmpLinkedList();
    	}
    }
    
    public void addEmp(Emp emp)
    {
    	int index = hash(emp.id);
    	empLinkedListArray[index].add(emp); ;
    }
    
    public Emp findEmpById(int id)
    {
    	var index = hash(id);
    	return empLinkedListArray[index].findEmpById(id);
    }
    
    public void list()
    {
    	for (int i = 0; i < size; i++)
    	{
    		empLinkedListArray[i].list();
    	}
    }
    /// <summary>
    /// 进行hash
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    private int hash(int id)
    {
    	return id % size;
    }
    }
    public class Emp
    {
    	//编号
    	public int id;
    	//姓名
    	public string name;
    	//Link next
    	public Emp next;
    
    	public Emp(int id, string name)
    	{
    		this.id = id;
    		this.name = name;
    	}
    }
    
    public class EmpLinkedList
    {
    	//头指针
    	private Emp head;
    
    	/// <summary>
    	/// 增加链表元素
    	/// </summary>
    	/// <param name="emp">新增链表元素</param>
    	public void add(Emp emp)
    	{
    		if (head == null)
    		{
    			head = emp;
    			return;
    		}
    		Emp curEmp = head;
    		while (true)
    		{
    			if (curEmp.next != null)
    			{
    				curEmp = curEmp.next;
    			}
    			else
    			{
    				break;
    			}
    		}
    		curEmp.next = emp;
    	}
    
    	/// <summary>
    	/// 展示栈中数据
    	/// </summary>
    	public void list()
    	{
    		if (head == null)
    		{
    			Console.WriteLine("链表为空");
    			return;
    		}
    		Emp curEmp = head;
    
    		while (true)
    		{
    			Console.Write(curEmp.name+"  ");
    			if (curEmp.next == null)
    			{
    				break;
    			}
    			curEmp = curEmp.next;
    		}
    		Console.WriteLine();
    	}
    	/// <summary>
    	/// 寻找链表中的元素
    	/// </summary>
    	/// <param name="id">元素id</param>
    	/// <returns></returns>
    	public Emp findEmpById(int id)
    	{
    		if (head == null)
    		{
    			//实际项目中抛出异常
    			Console.WriteLine("链表为空");
    			return null;
    		}
    		Emp curEmp = head;
    
    		while (true)
    		{
    			if (curEmp.id == id)
    			{
    				return curEmp;
    			}
    			if (curEmp.next == null)
    			{
    				return null;
    			}
    			curEmp=curEmp.next;
    		}
    	}
    }
    

    测试代码:

    static void Main(string[] args)
    {
    	HashTab Emps = new HashTab(7);
    	Emps.addEmp(new Emp(10,"张三"));
    	Emps.addEmp(new Emp(17, "小二"));
    	Emps.addEmp(new Emp(100, "李老板"));
    	Emps.list();
    	Console.Read();
    }
    

    运行结果:

  • 相关阅读:
    JS 实现的年月日三级联动
    【代码总结● Swing中的一些操作与设置】
    S7通信协议之你不知道的事儿
    .NetCore程序在Linux上面部署的实现
    什么是哈希表?
    什么是队列?
    什么是栈?
    什么是数组?
    什么是数据结构?
    什么是链表?
  • 原文地址:https://www.cnblogs.com/aoximin/p/13212944.html
Copyright © 2011-2022 走看看