1. 程式人生 > 實用技巧 >GoLang 資料結構-雜湊表(散列表)

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\n", 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\t名字:%v\n", 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("\t\t\t(>^ω^<) 社群流浪貓資訊管理系統 (>^ω^<)喵") 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 }
雜湊表案例(流浪貓資訊管理系統)