哈希表的一种Go语言实现
package mainimport ( "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("输出谬误") } }}