hash.go

package hash

import (
"fmt"
) type Emp struct {
ID int
Name string
Next *Emp
} //第一个节点就存放员工
type EmpLink struct {
Head *Emp
} //定义HashTable
type HashTable struct {
LinkArr []EmpLink
} //添加员工的方法
func (empl *EmpLink) InsertEmp(emp *Emp) {
cur := empl.Head
var pre *Emp = nil
if cur == nil {
empl.Head = emp
return
}
//如果不是一个空链表,找到对应的位置并插入
for {
if cur != nil {
if cur.ID >= emp.ID {
break
}
pre = cur
cur = cur.Next
} else {
break
}
}
pre.Next = emp
emp.Next = cur
}
func (hash *HashTable) Insert(emp *Emp) {
//使用散列函数,确定将员工添加到哪个链表
linkNum := hash.HashFunc(emp.ID)
hash.LinkArr[linkNum].InsertEmp(emp)
} func (empl *EmpLink) FindByID(id int) *Emp {
cur := empl.Head
for {
if cur != nil && cur.ID == id {
return cur
} else if cur == nil {
break
}
cur = cur.Next
}
return nil
} func (hash *HashTable) Find(id int) *Emp {
//使用散列函数确定在哪个链表
linkNum := hash.HashFunc(id)
return hash.LinkArr[linkNum].FindByID(id)
} //散列方法
func (hash *HashTable) HashFunc(id int) int {
return id %
}
func (empl *EmpLink) ShowLink(num int) {
if empl.Head == nil {
fmt.Printf("当前%d链表为空\n", num)
return
}
//否则遍历显示数据
cur := empl.Head
for {
if cur != nil {
fmt.Printf("链表:%d,员工id:%d,员工名字:%s-->", num, cur.ID, cur.Name)
cur = cur.Next
} else {
break
}
}
fmt.Println(``)
} func (hash *HashTable) Show() {
for i := ; i < len(hash.LinkArr); i++ {
hash.LinkArr[i].ShowLink(i)
}
} func (emp *Emp) ShowMe() {
fmt.Printf("链表%d找到该员工 %d\n", emp.ID%, emp.ID)
}

main.go

package main

import (
"fmt"
"go_code/data_structure/hash"
"os"
) func main() { key := ""
id :=
name := ""
var hashTable hash.HashTable
for {
fmt.Println("==========员工菜单==========")
fmt.Println("insert 表示添加员工")
fmt.Println("show 表示显示员工")
fmt.Println("find 表示查询员工")
fmt.Println("exit 表示退出员工")
fmt.Println("请输入你的选择:")
fmt.Scanln(&key)
switch key {
case "insert":
fmt.Println("请输入员工id:")
fmt.Scanln(&id)
fmt.Println("请输入员工名字:")
fmt.Scanln(&name)
emp := &hash.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的员工不存在\n", id)
} else {
//显示雇员信息
emp.ShowMe() }
case "exit":
os.Exit()
}
}
}

运行结果:

f:\goproject\src\go_code\data_structure>go run main.go
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
insert
请输入员工id:
1
请输入员工名字:
bob
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
insert
请输入员工id:
8
请输入员工名字:
mike
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
insert
请输入员工id:
15
请输入员工名字:
tom
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
insert
请输入员工id:
57
请输入员工名字:
pop
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
show
当前0链表为空
链表:1,员工id:1,员工名字:bob-->链表:1,员工id:8,员工名字:mike-->链表:1,员工id:15,员工名字:tom-->链表:1,员工id:57,员工名字:pop-->
当前2链表为空
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
insert
请输入员工id:
36
请输入员工名字:
bib
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
show
当前0链表为空
链表:1,员工id:1,员工名字:bob-->链表:1,员工id:8,员工名字:mike-->链表:1,员工id:15,员工名字:tom-->链表:1,员工id:36,员工名字:bib-->链表:1,员工id:57,员工名字:pop-->
当前2链表为空
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
insert
请输入员工id:
12
请输入员工名字:
viv
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
show
当前0链表为空
链表:1,员工id:1,员工名字:bob-->链表:1,员工id:8,员工名字:mike-->链表:1,员工id:15,员工名字:tom-->链表:1,员工id:36,员工名字:bib-->链表:1,员工id:57,员工名字:pop-->
当前2链表为空
当前3链表为空
当前4链表为空
链表:5,员工id:12,员工名字:viv-->
当前6链表为空
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
find
请输入你要查找的id:
12
链表5找到该员工 12
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
find
请输入你要查找的id:
7
id=7的员工不存在
==========员工菜单==========
insert 表示添加员工
show 表示显示员工
find 表示查询员工
exit 表示退出员工
请输入你的选择:
exit

f:\goproject\src\go_code\data_structure>

golang数据结构之散哈希表(Hash)的更多相关文章

  1. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  2. Redis原理再学习04:数据结构-哈希表hash表(dict字典)

    哈希函数简介 哈希函数(hash function),又叫散列函数,哈希算法.散列函数把数据"压缩"成摘要,有的也叫"指纹",它使数据量变小且数据格式大小也固定 ...

  3. 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)

    链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...

  4. 数据结构,哈希表hash设计实验

    数据结构实验,hash表 采用链地址法处理hash冲突 代码全部自己写,转载请留本文连接, 附上代码 #include<stdlib.h> #include<stdio.h> ...

  5. 数据结构 哈希表(Hash Table)_哈希概述

    哈希表支持一种最有效的检索方法:散列. 从根来上说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素. 哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表.哈希 ...

  6. 什么叫哈希表(Hash Table)

    散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. - 数据结构 ...

  7. python数据结构与算法——哈希表

    哈希表 学习笔记 参考翻译自:<复杂性思考> 及对应的online版本:http://greenteapress.com/complexity/html/thinkcomplexity00 ...

  8. PHP关联数组和哈希表(hash table) 未指定

    PHP有数据的一个非常重要的一类,就是关联数组.又称为哈希表(hash table),是一种很好用的数据结构. 在程序中.我们可能会遇到须要消重的问题,举一个最简单的模型: 有一份username列表 ...

  9. Java数据结构和算法 - 哈希表

    Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...

随机推荐

  1. 更改Android studio中SDK,AVD的默认路径

    对于大部分首次下载android studio开发android的人来说, 由于Android Studio将会默认把SDK,AVD下载到我们的C盘,造成大量内存的占用,那么如何更改SDK,AVD的路 ...

  2. 团队项目之Scrum7

    小组:BLACK PANDA 时间:2019.11.27 每天举行站立式会议 提供当天站立式会议照片一张 2 昨天已完成的工作 2 内容展示 根据三大板块进行分类: 电影. 音乐以及摄影 今天计划完成 ...

  3. CODING 2.0 企业级持续交付解决方案

    "The key to DevOps transformation is that there is no end-state-we must continuously evolve.&qu ...

  4. sql server2017开启远程连接

    1.安装完SQL server2017之后,选择SQL 身份验证登录,可以先用windows身份验证登录把密码更改好了,然后服务器右键重新启动 ,再断开连接 ,选择SQL身份验证登录验证,关闭SQL ...

  5. diango入门(持续更新中)

    学习注意点:理顺项目逻辑,记住重点,项目做好重点注释保留好,以后做项目了能知道这样可以实现,忘了回来查 下载 命令行 pip install django==1.11.26 -i https://py ...

  6. Notepad++ 异常崩溃 未保存的new *文件列表没了怎么办?

    今天就遇到这种问题了,把之前写的临时代码拷贝到Notepad++,不知道啥时候脑袋一抽风强迫症犯了就把所有临时代码给未保存关闭了,然后懊恼不已,百度了一下解决办法,一下就搜到了. Notepad++是 ...

  7. 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)

    点此看题面 大致题意: 有\(n\)个人相互开枪,每个人有一个仇恨度\(a_i\),每个人死后会开枪再打死另一个还活着的人,且第一枪由你打响.设当前剩余人仇恨度总和为\(k\),则每个人被打中的概率为 ...

  8. Logstash Multiple Pipelines

    作为生产者和消费者之间数据流的一个中心组件,需要一个 Logstash 实例负责驱动多个并行事件流的情况.默认情况下,这样的使用场景的配置让人并不太开心,使用者会遭遇所谓的条件地狱(Condition ...

  9. 使用pip安装python库的几种方式

    操作系统 : CentOS7.5.1804_x64 Python 版本 : 3.6.8 1.使用pip在线安装 1.1 安装单个package 格式如下: pip install SomePackag ...

  10. 关于实现序列化接口Serializable

    关于javabean,是否需要实现序列化接口这个问题,只有当这些javabean需要通过分布式网络传输,磁盘持久化等情况下才有必要,其他情况并非必须.