数据结构--哈希表

Posted Yuan_sr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构--哈希表相关的知识,希望对你有一定的参考价值。

哈希表的一种Go语言实现

package main

import (
    "fmt"
    "os"
)

//链表中的数据的信息
type Emp struct {
    Id int
    Name string
    Next *Emp
}

func (e *Emp) ShowSelf() {
    fmt.Printf("链表%d 找到了该节点 %d\\n", e.Id % 7, e.Id)
}

//定义链表,该链表不带头结点
type EmpLink struct {
    Head *Emp
}

//EmpLink的添加方法
func (l *EmpLink) Insert (emp *Emp) {
    //定义两个辅助指针
    cur := l.Head
    var pre *Emp = nil

    //判断是否为空链表
    if cur == nil { //链表头部插入
        l.Head = emp
        //cur = emp //这样会导致节点添加不上,不知道什么原因
        return
    }

    //如果不是空链表,给emp找到对应的位置并插入
    for {
        if cur != nil { //链表中部插入
            if cur.Id >= emp.Id {
                pre.Next = emp
                emp.Next = cur
                break
            }
            pre = cur
            cur = cur.Next
        } else { //链表尾部插入
            pre.Next = emp
            emp.Next = cur
            break
        }
    }
}

func (l *EmpLink)FindId(id int) *Emp{
    cur := l.Head
    for {
        if cur != nil && cur.Id == id {
            return cur
        }else if cur == nil {
            break
        }
        cur = cur.Next
    }
    return nil
}

//定义一个显示链表元素的方法
func (l *EmpLink) ShowLink(no int) {
    if l.Head == nil {
        fmt.Printf("链表%d 为空\\n", no)
        return
    }

    //遍历当前链表并显示数据
    cur := l.Head
    for {
        if cur != nil {
            fmt.Printf("链表%d 节点Id= %d 名字=%s -> ", no, cur.Id, cur.Name)
            cur = cur.Next
        } else {
            break
        }
    }
    fmt.Println()
}

//定义一个hash table,内部含有7条链表
type HashTable struct {
    LinkArr [7]EmpLink
}

//hashtable的添加方法
func (h *HashTable) Insert (emp *Emp) {
    //使用散列函数,确定将该节点添加到哪个链表
    LinkNo := h.HashFun(emp.Id)
    //使用对应的链表添加
    h.LinkArr[LinkNo].Insert(emp)
}

func (h *HashTable) Find(no int) *Emp {
    lindNo := h.HashFun(no)
    return  h.LinkArr[lindNo].FindId(no)
}
//显示hashtable所有节点
func (h *HashTable) ShowAll() {
    for i := 0; i < len(h.LinkArr); i++ {
        h.LinkArr[i].ShowLink(i)
    }
}

func (h *HashTable) HashFun (id int) int {
    return id % 7 //返回链表下标
}

func main(){
    var hashtable HashTable
    key := ""
    id := 0
    name := ""
    for {
        fmt.Println("====================系统菜单=====================")
        fmt.Println("input 添加节点")
        fmt.Println("show 显示节点")
        fmt.Println("find 查找节点")
        fmt.Println("exit 退出系统")
        fmt.Println("请输入你的选择")
        fmt.Println("请输入你的选择")
        fmt.Scanln(&key)
        switch key {
        case "input":
            fmt.Println("输入节点ID")
            fmt.Scanln(&id)
            fmt.Println("输入节点Name")
            fmt.Scanln(&name)
            emp := &Emp{
                Id:   id,
                Name: name,
            }
            hashtable.Insert(emp)
        case "show":
            hashtable.ShowAll()
        case "find":
            fmt.Println("请输入要查找的ID号")
            fmt.Scanln(&id)
            emp := hashtable.Find(id)
            if emp == nil {
                fmt.Println("id=%d 的节点不存在\\n", id)
            }else {
                emp.ShowSelf()
            }
        case "exit":
            os.Exit(0)
        default:
            fmt.Println("输入错误")
        }
    }
}

以上是关于数据结构--哈希表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法详解什么是哈希表,并用代码手动实现一个哈希表

数据结构哈希表--线性探测和哈希桶及unordered_set,unordered_map代码示范

数据结构哈希表--线性探测和哈希桶及unordered_set,unordered_map代码示范

C语言哈希表

[DataStructure]哈希表二叉树及多叉树 Java 代码实现

菜鸟nginx源代码剖析数据结构篇 哈希表 ngx_hash_t(上)