哈希表
图片来自百度百科
案例操作(案例操作的存储方式为:输入的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 }