数据结构之Hash表


阅读目录

一、Hash表介绍

二、Hash表应用

一、Hash表介绍

二、Hash表应用

package main

import (
	"fmt"
	"os"
)

func main() {
	var hashtable HashTable
	key := ""
	id := 0
	name := ""
	for {
		fmt.Println("===========雇员系统菜单=============")
		fmt.Println("===========input 添加雇员=============")
		fmt.Println("===========show 显示雇员=============")
		fmt.Println("===========update 修改雇员=============")
		fmt.Println("===========find 查找雇员=============")
		fmt.Println("===========exit 退出=============")
		fmt.Println("请输入你的选择")
		fmt.Scanln(&key)
		switch key {
		case "input":
			fmt.Println("请输入雇员id")
			fmt.Scanln(&id)
			fmt.Println("请输入雇员名")
			fmt.Scanln(&name)
			emp := &Emp{
				Id:   id,
				Name: name,
			}
			hashtable.Insert(emp)
		case "show":
			hashtable.show()
		case "find":
			fmt.Println("请输入雇员id")
			fmt.Scanln(&id)
			emp := hashtable.Find(id)
			if emp == nil {
				fmt.Printf("id=%d 的雇员不存在
", id)
			} else {
				emp.ShowMe()
			}
		case "exit":
			os.Exit(0)
		default:
			fmt.Println("输入错误...")
		}
	}
}

// 链表Emp
type Emp struct {
	Id   int
	Name string
	Next *Emp
}

func (this *Emp) ShowMe() {
	fmt.Printf("链表%d,雇员%d,名称%s
", this.Id%7+1, this.Id, this.Name)
}

//EmpLink -> 不带表头
type EmpLink struct {
	Head *Emp
}

func (this *EmpLink) FindById(id int) *Emp {
	cur := this.Head
	for {
		if cur != nil && cur.Id == id {
			return cur
		} else if cur == nil {
			break
		}
		cur = cur.Next
	}
	return nil
}

// 显示当前列表的信息
func (this *EmpLink) Show(no int) {
	if this.Head == nil {
		fmt.Printf("当前链表【%d】数据为空
", no+1)
		return
	}
	cur := this.Head
	for {
		if cur != nil {
			fmt.Printf("链表%d,雇员id=%d,名字=%s -->", no+1, cur.Id, cur.Name)
			cur = cur.Next
		} else {
			break
		}
	}
	fmt.Println()
}

//添加员工的方法
func (this *EmpLink) Insert(emp *Emp) {
	//添加时 编号从小到达
	cur := this.Head
	var pre *Emp = nil //pre在cur之前
	//如果当前Emplink空链表
	if cur == nil {
		this.Head = emp
		return
	}
	// 添加最开始
	if emp.Id < cur.Id {
		this.Head = emp
		this.Head.Next = cur
		return
	}
	//非空链表,给emp找到对应的位置并插入
	//思路 让cur与emp比较  且 pre保持在cur之前
	for {
		if cur != nil {
			if cur.Id >= emp.Id {
				break // 找到位置
			}
			pre = cur
			cur = cur.Next
		} else {
			// 最大值得时候
			break
		}
	}
	// 退出链表时
	//if cur == nil{
	pre.Next = emp
	emp.Next = cur
	//}

}

//含一个链表数组
type HashTable struct {
	LinkArr [7]EmpLink
}

// HashTable ->insert
func (this *HashTable) Insert(emp *Emp) {
	//使用散列函数确认添加到哪个链表数组
	linkNo := this.HashFunc(emp.Id)
	//使用对应的散链表数组添加
	this.LinkArr[linkNo].Insert(emp)
}

// HashTable ->show 显示所有雇员
func (this *HashTable) show() {
	for i := 0; i < len(this.LinkArr); i++ {
		this.LinkArr[i].Show(i)
	}

}

func (this *HashTable) Find(id int) *Emp {
	// 确认链表
	no := this.HashFunc(id)
	return this.LinkArr[no].FindById(id)
}

// 编写一个散列的方法
func (this *HashTable) HashFunc(id int) int {
	return id % 7 //对应链表的下标
}

原文地址:https://www.cnblogs.com/zhangliang91/p/11716427.html