• GoLang 数据结构-哈希表(散列表)


    哈希表

     

                                               图片来自百度百科

    案例操作(案例操作的存储方式为:输入的ID编号%7)

      1 package main
      2 
      3 import (
      4     "fmt"
      5     "os"
      6 )
      7 
      8 //Cat 流浪猫结构体
      9 type Cat struct {
     10     ID   int
     11     Name string
     12     Age  int
     13 
     14     Next *Cat
     15 }
     16 
     17 //ShowMe 显示猫咪自己的信息
     18 func (c *Cat) ShowMe() {
     19     fmt.Printf("流浪猫链表:%v 找到了猫咪ID: %v  名称:%v
    ", c.ID%7, c.ID, c.Name)
     20 }
     21 
     22 /*
     23 CatLink 猫咪链表结构体
     24 
     25 head *Cat 头部指向猫咪
     26 不带表头,第一个节点就开始存放猫咪
     27 */
     28 type CatLink struct {
     29     head *Cat
     30 }
     31 
     32 //FindEmpByID CatLink的根据id查找猫咪
     33 func (ctl *CatLink) FindEmpByID(id int) *Cat {
     34     current := ctl.head
     35     for {
     36         if current != nil && current.ID == id {
     37             //找到
     38             return current
     39         } else if current == nil {
     40             break
     41         }
     42         //继续往下找
     43         current = current.Next
     44     }
     45     return nil
     46 }
     47 
     48 //ShowLinks 显示所有流浪猫的详情信息
     49 func (ctl *CatLink) ShowLinks(id int) {
     50     if ctl.head == nil {
     51         fmt.Printf("流浪猫链表 %v 为空...", id)
     52     }
     53     //不为空
     54     current := ctl.head
     55     for {
     56         if current != nil {
     57             fmt.Printf("流浪猫链表[%v] 猫咪ID:%v	名字:%v
    ", id, current.ID, current.Name)
     58             current = current.Next
     59         } else {
     60             break
     61         }
     62     }
     63     fmt.Println()
     64 }
     65 
     66 //Insert CatLink插入方法
     67 func (ctl *CatLink) Insert(cat *Cat) {
     68     current := ctl.head //辅助指针
     69     var pre *Cat = nil  //辅助指针,指向current前面
     70     //如果当前CatLink是一个空链表
     71     if current == nil {
     72         ctl.head = cat
     73         return
     74     }
     75     /*
     76         如果不是空链表,就给cat找到对应的位置并插入数据
     77         思路:
     78         让current 与 cat 比较,然后让pre 保持在current前面
     79     */
     80     for {
     81         if current != nil {
     82             if current.ID > cat.ID {
     83                 break
     84             }
     85             //保证同步
     86             pre = current
     87             current = current.Next
     88         } else {
     89             break
     90         }
     91     }
     92     //退出时,将emp添加到链表最后
     93     pre.Next = cat
     94     cat.Next = current
     95 }
     96 
     97 /*
     98 HashTable 哈希表
     99 
    100 LinkList [10]CatLink 代表含有10个链表数据
    101 */
    102 type HashTable struct {
    103     LinkList [10]CatLink
    104 }
    105 
    106 //Insert 添加猫咪
    107 func (ht *HashTable) Insert(cat *Cat) {
    108     linkNo := ht.HashFunc(cat.ID)
    109     ht.LinkList[linkNo].Insert(cat)
    110 
    111 }
    112 
    113 /*HashFunc 哈希散列方法 */
    114 func (ht *HashTable) HashFunc(id int) int {
    115     /*
    116         这个值就代表链表的下标,
    117         根据输入的ID值 %7 =几 就分配到第几个ID的链表
    118     */
    119     return id % 7
    120 }
    121 
    122 //PrintAll 输出所有流浪猫
    123 func (ht *HashTable) PrintAll() {
    124     for i := 0; i < len(ht.LinkList); i++ {
    125         ht.LinkList[i].ShowLinks(i)
    126     }
    127 }
    128 
    129 //FindCatByID 根据id查找猫咪
    130 func (ht *HashTable) FindCatByID(id int) *Cat {
    131     linkNo := ht.HashFunc(id)
    132     return ht.LinkList[linkNo].FindEmpByID(id)
    133 }
    134 func main() {
    135     var key int
    136     var id int
    137     var name string
    138     var age int
    139     // var sex string
    140     // var color string
    141     // var Cattype string
    142     var ht HashTable
    143     for {
    144         fmt.Println("			(>^ω^<) 社区流浪猫信息管理系统 (>^ω^<)喵")
    145         fmt.Println(
    146             `
    147             1        添加流浪猫
    148             2.        显示流浪猫
    149             3.        查找流浪猫
    150             4.        退出系统
    151             请输入(1-4)
    152         `)
    153         fmt.Scanln(&key)
    154         switch key {
    155         case 1:
    156             fmt.Println("请输入猫咪的  ID  ")
    157             fmt.Scanln(&id)
    158             fmt.Println("请输入猫咪的  名称  ")
    159             fmt.Scanln(&name)
    160             fmt.Println("请输入猫咪的  年龄  ")
    161             fmt.Scanln(&age)
    162             cat := &Cat{
    163                 ID:   id,
    164                 Name: name,
    165                 Age:  age,
    166             }
    167             ht.Insert(cat)
    168 
    169         case 2:
    170             ht.PrintAll()
    171         case 3:
    172             fmt.Println("请输入要查找的猫咪ID")
    173             fmt.Scanln(&id)
    174             cat := ht.FindCatByID(id)
    175             if cat == nil {
    176                 fmt.Println("链表中 未找到该猫咪...")
    177             } else {
    178                 cat.ShowMe()
    179             }
    180         case 4:
    181             fmt.Println("退出了流浪猫信息管理系统...")
    182             os.Exit(0)
    183 
    184         default:
    185             fmt.Println("操作有误(请输入1-4)")
    186         }
    187     }
    188 }
    哈希表案例(流浪猫信息管理系统)
    时间若流水,恍惚间逝去
  • 相关阅读:
    lingpipe
    小白都会的邮件推送?你还不会吗?
    怎么拿到签到王者的勋章?
    分享几个学习鸿蒙的社区平台
    小白都会的一键软件搬家?你还不会吗?
    博客网站接入网站统计
    CSDN博客怎么别人的文章?
    HarmonyOS的组件、布局和事件三者的关系
    Markdown格式快速转换为富文本格式
    Python学习
  • 原文地址:https://www.cnblogs.com/alanshreck/p/14174920.html
Copyright © 2020-2023  润新知