• 重新整理数据结构与算法—— 简单的哈希链表[十五]


    前言

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

    首先来看一张图:

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

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

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

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

    正文

    代码如下:

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

    运行结果:

  • 相关阅读:
    Linux常用指令整理
    结构型模式-组合模式(树形结构的处理)
    结构型模式-适配器模式(不兼容结构的协调)
    创建型模式-原型模式(对象的克隆)
    创建型模式-单例模式(确保对象唯一性)
    创建型模式-抽象工厂
    Linux之linux下安装mysql
    关于elipse中maven搭建好后,一直building workspace的问题
    idea配置数据库下载驱动
    idea配置maven以及手动添加webapp目录
  • 原文地址:https://www.cnblogs.com/aoximin/p/13212944.html
Copyright © 2020-2023  润新知