数据结构之哈希表

数据结构之哈希表

本文使用例子来说明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)
}

删除和修改后续更新
如果看完对自己有帮助的话,希望小伙伴点个赞哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值