golang数据结构之散哈希表(Hash)
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)的更多相关文章
- 算法与数据结构基础 - 哈希表(Hash Table)
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...
- Redis原理再学习04:数据结构-哈希表hash表(dict字典)
哈希函数简介 哈希函数(hash function),又叫散列函数,哈希算法.散列函数把数据"压缩"成摘要,有的也叫"指纹",它使数据量变小且数据格式大小也固定 ...
- 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)
链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...
- 数据结构,哈希表hash设计实验
数据结构实验,hash表 采用链地址法处理hash冲突 代码全部自己写,转载请留本文连接, 附上代码 #include<stdlib.h> #include<stdio.h> ...
- 数据结构 哈希表(Hash Table)_哈希概述
哈希表支持一种最有效的检索方法:散列. 从根来上说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素. 哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表.哈希 ...
- 什么叫哈希表(Hash Table)
散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. - 数据结构 ...
- python数据结构与算法——哈希表
哈希表 学习笔记 参考翻译自:<复杂性思考> 及对应的online版本:http://greenteapress.com/complexity/html/thinkcomplexity00 ...
- PHP关联数组和哈希表(hash table) 未指定
PHP有数据的一个非常重要的一类,就是关联数组.又称为哈希表(hash table),是一种很好用的数据结构. 在程序中.我们可能会遇到须要消重的问题,举一个最简单的模型: 有一份username列表 ...
- Java数据结构和算法 - 哈希表
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...
随机推荐
- C lang:Pointer and multidimensional array
Xx_Introduction Double indrection:Address of Address;Pointer of Pointer Ax_Code #include<stdio.h& ...
- Go交叉编译(Go语言Mac/Linux/Windows下交叉编译)
Go交叉编译(Go语言Mac/Linux/Windows下交叉编译) 2019/11/21 Chenxin 在很多时候,由于开发的方便,会有这样的场景出现,使用Mac开发或使用Windows开发,需要 ...
- 对Windows桌面应用程序进行UI自动化测试
题记:本文简述如何利用appium对Windows桌面应用程序进行UI自动化测试. 所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows ...
- 第04组 Beta冲刺(3/4)
队名:斗地组 组长博客:地址 作业博客:Beta冲刺(3/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.分配展示任务 2.收集各个组员的进度 3.写博客 展示GitHub当日代码/文档 ...
- [译]Vulkan教程(27)Image
[译]Vulkan教程(27)Image Images Introduction 入门 The geometry has been colored using per-vertex colors so ...
- Jrebel实现tomcat热部署,遇到的问题以及解决办法,详解
我的安装的详细过程: 下载Jrebel: https://github.com/ilanyu/ReverseProxy/releases/tag/v1.4 我的是winx64,所以选择如下的: 下载 ...
- SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用
一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层 ...
- spring = servlet + 依赖管理 + 业务逻辑
spring = servlet + 依赖管理 + 业务逻辑
- SpringCloud的入门学习之概念理解、Eureka服务注册与发现入门
1.微服务与微服务架构.微服务概念如下所示: 答:微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题.提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面的一个个微服务 ...
- 02-java性能调优-JVM内存模型详解
JVM整体结构与内存模型之间的关系 JVM整体结构图如下: 先贴一个代码: package com.jvm.jvmCourse2; public class Math { public static ...