开发者学堂课程【Go 语言核心编程 - 数据结构和算法: 数据结构和算法-哈希表(散列)3】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/627/detail/9867
数据结构和算法-哈希表(散列)3
基于 hashtable 的雇员关系系统的思路分析
1. 优化代码
package main
Import (
“
fmt
”
)
//定义 emp
type Emp struct {
Id int
Name string
Next * Emp
}
//方法待定..
//定义 EmpLink
//我们这里的 EmpLink 不带表头,即第一个节点就存放雇员
type EmpLink struct {
Head * Emp
}
//方法待定.
//1.添加员工的方法,保证添加时,编号从小到大
func (this *EmpLink) Insert(emp *Emp) {
cur := thie.Head
// 这是辅助指针
var pre *Emp = nil
//这是一个辅助指针 pre 在 cur 前面
// 如果当前的 EmpLink 就是一个空链表
If cur == nil {
this.Head = emp
//完成
return
}
// 如果不是一个空链表,给 emp 找到对应的位置并插入
//思路是让 cur 和 emp 比较,然后让 pre 保持在 cur 前面
for {
If cur !=nil {
//比较
if cur.Id > emp.Id {
//找到位置
break
}
Pre = cur
//保证同步
cur = cur.Next
}else {
Break
}
}
//退出时,我们看下是否将 emp 添加到链表最后
pre.Next = emp
emp.Next = cur
}
//显示链表信息
func (this *EmpLink) ShowLink(no int) {
if this. Head == nil {
fmt.Printf(
“
链表%d 为空\n
”
,no)
return
}
//变量当前的链表,并显示数据
cur := this.Head
// 辅助的指针
for {
If cur != nil {
fmt.Printf(
“
链表%d 雇员id=%d 名字=%s
->
”
,no,cur.Id,cur.Name)
cur =cur.Next
} else {
Break
}
Fmt.PrintIn()
//换行处理
}
//根据 id 查找对应的雇员,如果没有就返回 nil
Func (this * EmpLink) FindById(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
}
//给 HashTable 编写 Insert 雇员的方法.
func (this *HashTable) Insert (emp *Emp) {
//使用散列函数,确定将该雇员添加到哪个链表
linkNo := this.HashFun(emp.Id)
//使用对应的链表添加
this.LinkArr[linkNo].Insert(emp) //
}
//编写方法,显示 hashtable 的所有雇员
func (this *HashTable) ShowALL() {
for
//编写一个散列方法
func (this *HashTable) HashFun(id int) int {
Return id % 7
//得到一个值,就是对于的链表的下标
}
func main() {
for {
fmt.PrintIn(
“
===============雇员系统菜单
===============”)
fmt.PrintIn(“input 表示添加雇员”)
Fmt.PrintIn(“show 表示显示雇员”)
fmt.PrintIn(“find 表示查找雇员”)
fmt.PrintIn(“exit 表示退出系统”)
fmt.PrintIn(“请输入你的选择”)
fmt.ScanIn(&key)
switch key {
case
“
input
”
:
fmt.PrintIn(
“
输入雇员id
”
)
fmt.ScanIn(&id)
Fmt.PrintIn(
“
输入雇员name
”
)
Fmt.ScanIn(&name)
emp := &Emp{
Id : id,
Name : name,
}
Hashtable.Insert(emp)
Case
“
show
”
:
Hashtable.ShowAll()
Case
“
exit
”
:
Default:
Fmt.PrintIn(
“
输入错误”)
}
}
}