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 }
哈希表案例(流浪猫信息管理系统)
时间若流水,恍惚间逝去
原文地址:https://www.cnblogs.com/alanshreck/p/14174920.html