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.一般的计 ...
随机推荐
- arcgis api for javascript 学习(一) 调用在线发布的动态地图
1.图中显示为arcgis软件中显示的地图文件 2.调用动态地图主要的是知道动态地图的URL地址 3.通过IDE(webstorm)调用动态地图,如图 4.话不多说,直接上代码 <!DOCTYP ...
- Git介绍与简易搭建
Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...
- Troubleshooting: High Version Count Issues
--查询版本高的原因 select * from v$sql_shared_cursor where sql_id=''; Configuring Download the script in the ...
- Linux命令详解 三
Linux用户和组的属性与权限本章结构1.用户账号和组账号概述2.用户账号和组账号管理3.查询账号信息4.查看目录或文件的属性5.设置目录或文件的权限6.设置目录或文件的归属 前言在linux中一切都 ...
- 自生成图片验证码Servlet
package com.woniuxy.busniess.servlet; import java.awt.*; import java.awt.geom.*; import java.awt.ima ...
- oracle创建新用户并授予权限
1.同时按下WIN键+R键打开“运行”,输入cmd,回车进入命令提示符 2.输入“sqlplus”后按下回车键,提示输入用户名,输入“sys as sysdba”,按下回车,输入口令,即四-13中设置 ...
- 07. Go 语言接口
Go 语言接口 接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程. Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具 ...
- 服务监控之 Spring Boot Admin.
一.概述 开始阅读这篇文章之前,建议先阅读下<SpringBoot 之Actuator>,该篇文章提到 Spring Boot Actuator 提供了对单个Spring Boot的监控 ...
- 3种不走寻常路的黑客攻击泄露&如何保护自己?
数据泄露和黑客攻击现在已经成为我们日常生活中的常见部分,除非您是网络安全专业人员或您的个人数据受到威胁,否则您实际上并不关心是否存在新的漏洞. 正如美国联邦贸易委员会指出的那样,万豪酒店连锁店的超过5 ...
- Springboot对SpringMVC如何扩展配置
原文地址:http://www.javayihao.top/detail/171 概述 Springboot在web层的开发基本都是采用Springmvc框架技术,但是Springmvc中的某些配置在 ...