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 [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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM