45.Go语言·数据结构·哈希表

2019-06-23  本文已影响0人  一枼落知天下

main.go

// Go语言·数据结构·哈希表
package main

import (
    "fmt"
)

var content string = `
————————————————Go语言·数据结构·哈希表————————————————————
一、哈希表
    
`

type Emp struct {
    Id   int
    Name string
    Next *Emp
}

func (this *Emp) EmpInfo() {
    fmt.Println()
    fmt.Printf("<No.%d, %s> \n", this.Id,this.Name)
}


// 定义一个EmpLink,不带表头,
// 第一个就存放数据
type EpmLink struct {
    Head *Emp
}

// 添加员工的方法
// 保证添加时候,是从小到大
func (this *EpmLink) Add(emp *Emp) {
    var pre *Emp = nil
    current := this.Head

    if current == nil {
        this.Head = emp
        return
    }
    
    for {
        if current != nil {
            // emp.id 和 current.id比较
            if current.Id > emp.Id {
                // 找到位置:
                break
            }
            // pre保持在cur前面
            pre = current
            current = current.Next
        }else{
            break
        }
    }
    // 利用pre进行添加
    // 顺序:pre-->emp--->current
    pre.Next = emp
    emp.Next = current
}

// 显示
func (this *EpmLink) ShowLink(num int) {
    fmt.Printf("链表<NO.%d>:",num)
    current := this.Head
    for {
        if current != nil {
            fmt.Printf("[No.%.4d %s]-->",current.Id,current.Name)
            current = current.Next
        }else{
            break
        }
    }
    fmt.Println()
}

// 根据id查找信息,没有就返回 nil
func (this *EpmLink) FindById(id int) *Emp {
    curr := this.Head
    for {
        if curr != nil  && curr.Id == id {
            return curr
        }else if curr == nil{
            break
        }
        curr = curr.Next
    }
    return  nil
}



// 定义一个hashTable,含有一个链表数组
type HashTable struct {
    LinkArr [7]EpmLink
}

// 编写一个散列的方法
// 对应的链表的下标
func (this *HashTable) HashSet(id int) int {
    return id % len(this.LinkArr)
}

// 给hashTable  添加的方法
func (this *HashTable) Hset(emp *Emp) {
    // 使用散列函数,确定将该雇员,添加到那个链表
    linkNo := this.HashSet(emp.Id)
    // 对应的链表添加
    this.LinkArr[linkNo].Add(emp)
}

// 显示
func (this *HashTable) ShGetall() {
    for i := 0; i <len(this.LinkArr); i++ {
        this.LinkArr[i] .ShowLink(i)
    }
}

// 根据id查找
func (this *HashTable) FindById(id int) *Emp {
    linkNo := this.HashSet(id)
    return this.LinkArr[linkNo].FindById(id)
}



func main() {
    htable := &HashTable{}
    emp1 := &Emp{Id:7,Name:"Faker"}
    htable.Hset(emp1)
    emp2 := &Emp{Id:14,Name:"Uzi"}
    htable.Hset(emp2)
    emp3 := &Emp{Id:989,Name:"Mata"}
    htable.Hset(emp3)
    emp4 := &Emp{Id:36,Name:"Mata"}
    htable.Hset(emp4)

    htable.ShGetall()
    my := htable.FindById(36)
    if my != nil{
        my.EmpInfo()
    }
}



上一篇 下一篇

猜你喜欢

热点阅读