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

前言

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

首先来看一张图:

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

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

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

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

正文

代码如下:

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

运行结果:

posted @ 2020-07-01 14:45  敖毛毛  阅读(208)  评论(0编辑  收藏  举报