package main
import (
"fmt"
)
// 主函数
func main() {
fmt.Println("欢迎 来到 Go 语言社区,www.golangweb.com")
testhash := create_hash_table()
bret := insert_data_into_hash(testhash, 5)
insert_data_into_hash(testhash, 6)
if false == bret {
fmt.Println("插入失败!!!")
}
tetsnode := find_data_in_hash(testhash, 5)
fmt.Println(tetsnode)
return
}
//hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,
//但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,
//同时不占用太多的内容空间,使用也十分方便。
// a)定义hash表和基本数据节点
type _NODE struct {
data int
next *_NODE
}
type _HASH_TABLE struct {
value [10]*_NODE
}
// b)创建hash表
func create_hash_table() *_HASH_TABLE {
// 初始化数据,也就是数据的创建的操作
pHashTbl := new(_HASH_TABLE)
return pHashTbl
}
// c)在hash表当中寻找数据
func find_data_in_hash(pHashTbl *_HASH_TABLE, data int) *_NODE {
var pNode *_NODE
// 判断数据为空不
if nil == pHashTbl {
return nil
}
pNode = pHashTbl.value[data%10]
// 数组的数据的判断
if nil == pNode {
return nil
}
// 循环取数据
for {
if nil == pNode {
break
}
if data == pNode.data {
return pNode
}
pNode = pNode.next
}
return nil
}
// d)在hash表当中插入数据
func insert_data_into_hash(pHashTbl *_HASH_TABLE, data int) bool {
var pNode *_NODE
// 判断数据为空不
if nil == pHashTbl {
return false
}
// 数据转换逻辑
if nil == pHashTbl.value[data%10] {
pNode = new(_NODE)
pNode.data = data
pHashTbl.value[data%10] = pNode
fmt.Println("pNode:", pNode)
return true
}
if nil == find_data_in_hash(pHashTbl, data) {
return false
}
pNode = pHashTbl.value[data%10]
for {
if nil == pNode.next {
break
}
pNode = pNode.next
}
pNode.next = new(_NODE)
pNode.next.data = data
return true
}
// e)从hash表中删除数据
func delete_data_from_hash(pHashTbl *_HASH_TABLE, data int) bool {
var pHead *_NODE
var pNode *_NODE
if nil == pHashTbl || nil == pHashTbl.value[data%10] {
return false
}
pNode = find_data_in_hash(pHashTbl, data)
if nil == pNode {
return false
}
if pNode == pHashTbl.value[data%10] {
pHashTbl.value[data%10] = pNode.next
goto final
}
pHead = pHashTbl.value[data%10]
for {
if nil == pHead.next {
break
}
pHead = pHead.next
pHead.next = pNode.next
}
final:
// 清除指针数据
pNode = nil
return true
}
//总结:
// 1、hash表不复杂,我们在开发中也经常使用,建议朋友们好好掌握;