数据结构之哈希表
本文使用例子来说明hash的作用以及相关的使用
思路分析:
首先定义一个数组储存链表,每一个数组元素的链表都储存用户,本例子通过id来区分,不同的链表表示对数组数的除然后余数(举例:比如我id=12,数组中的链表长度为7,那么12除以7为1余5,那我们就把12储存在5号链表中),这样处理的好处在于加快了速度,比如一个很大的数字,在整除7(或者更大的哈希表数组长度)的时候,这个时候会很快的定位到所需链表,然后进行查询,最后查找。
一、哈希表的创建与添加值
package main
import (
"fmt"
"os"
)
type Emp struct{
id int
name string
next *Emp
} //创建顾客链表
type EmpLink struct{ //存放头指针
Head *Emp
}
type HashTable struct{ //存放数组链表
LinkArr [7]EmpLink
}
func (this *EmpLink) Insert(emp *Emp){ //插入链表方法
cur:=this.Head
var pre *Emp=nil //辅助指针
if cur==nil{ //链表中没有一个顾客的时候
this.Head=emp
return
}
for{
if cur!=nil{
if cur.id>=emp.id{ //找到位置
break
}else{
pre=cur
cur=cur.next //指针往前移动
}
}else{
break
}
}
pre.next=emp
emp.next=cur //插入链表
}
func (this *HashTable) HashFun(id int) int{ //判断储存在哪张链表
return id % 7
}
func (this *HashTable) Insert(emp *Emp){ //插入链表
LinkNum:=this.HashFun(emp.id) //查询哪个链表插入
this.LinkArr[LinkNum].Insert(emp) //插入该链表
}
func (this *HashTable) Show(num int){
cur:=this.LinkArr[num].Head
if cur==nil{
fmt.Printf("链表%d为空\n",num)
return
}
for{
if cur!=nil{
fmt.Printf("链表%d:id=[%d],名字=[%s]->",num,cur.id,cur.name)
cur=cur.next
}else{
break
}
}
fmt.Println()
}
func (this *HashTable) ShowAll(){
for i:=0;i<len(this.LinkArr);i++{
this.Show(i)
}
}
func main(){
var key int
var id int
var name string
var hashTable HashTable
for{
fmt.Println("=====菜单选择=====")
fmt.Println("=====1、添加=====")
fmt.Println("=====2、展示=====")
fmt.Println("=====3退出=====")
fmt.Printf("=====请输入选择:=====")
fmt.Scanln(&key)
switch key{
case 1:
fmt.Println("id:")
fmt.Scanln(&id)
fmt.Println("name:")
fmt.Scanln(&name)
emp:=&Emp{
id:id,
name:name,
}
hashTable.Insert(emp)
case 2:
hashTable.ShowAll()
case 3:
fmt.Println("已经退出")
os.Exit(0)
default:
fmt.Println("输入错误")
}
}
}
二、查找
func (this *Emp) Show(id int){
fmt.Printf("链表%d中找到id为%d",id%7,id)
}
func (this *EmpLink) Find(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 *HashTable) Find(num int) *Emp{
LinkNum:=this.HashFun(num)
return this.LinkArr[LinkNum].Find(num)
}
删除和修改后续更新
如果看完对自己有帮助的话,希望小伙伴点个赞哦