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 [7]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 % 7 } 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 := 0; i < len(hash.LinkArr); i++ { hash.LinkArr[i].ShowLink(i) } } func (emp *Emp) ShowMe() { fmt.Printf("鏈表%d找到該員工 %d\n", emp.ID%7, emp.ID) }
main.go
package main import ( "fmt" "go_code/data_structure/hash" "os" ) func main() { key := "" id := 0 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(0) } } }
運行結果:
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>