数据结构--散列表(哈希表)2

本文主要采用:

构造方法:除留余数法: f(key)=key%p (P<=m m:散列表的长度)

处理散列冲突方法:链地址法(单链表)

代码实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package main

import "fmt"

/*
除留余数发定址 线性探测发解决冲突
*/
type keyType int //key值的类型
type valueType int //value值的类型
const maxSize = 12 //hastable的最大长度
//除留余数发: f(key)=key%p (P<=m m:散列表的长度)
var p = 11
var nullKey = keyType(-65535)
var nullValue = valueType(-65535) //无效的数据

type hashData struct {
key keyType //key值
value valueType //value值
next *hashData
}

var hashTable [maxSize]hashData //定义哈希表,大小为maxSize,类型为:hashData
//初始化哈希表
func initHashTable() {
for i := 0; i < len(hashTable); i++ {
// 头结点
p := new(hashData)
p.key = nullKey //空值
p.value = nullValue //空值
p.next = nil
dataNode := hashData{keyType(nullKey), valueType(nullValue), p}
hashTable[i] = dataNode
}
}

//向哈希表添加数据元素
func insertHashTable(ht *[maxSize]hashData, key keyType, value valueType) bool {
//先查找,如果key值已经存在,则替换成key新对应的value
data:=searchHashTable(ht,key)
if data!=nil{
//已经存在
data.value=value
return true
}
addr := int(key) % p
//开辟空间 新建节点
q := new(hashData)
q.key = key //赋 key值
q.value = value //赋value值
r := ht[addr].next
//找到最末尾元素
for r.next != nil {
r = r.next
}
q.next = r.next
r.next = q
return true
}

//查找数据
func searchHashTable(ht *[maxSize]hashData, key keyType) (data *hashData) {
//按照添加的位置 找对应的数据(链表),而不是对数组遍历
addr := int(key) % p
//fmt.Println("------------",addr)
data = nil
q := ht[addr].next
for q != nil {
if q.key == key {
return q //如果找个,返回对应的节点(指针指向此节点)
}
q = q.next //移动到下一个位置继续
}
return
}

//删除数据
func deleteHashTable(ht *[maxSize]hashData, key keyType) bool {
addr := int(key) % p
q := ht[addr].next
r := q.next
for r != nil {
//删除节点
if r.key == key {
q.next = r.next
return true
}
q = r
r = q.next
}
return false
}
func main() {
//初始化哈希表
initHashTable()
//添加数据
// 元素0对应的数据
insertHashTable(&hashTable, 0, 48)
m := searchHashTable(&hashTable, 0)
if m != nil {
fmt.Printf("【%d】:%d\n", m.key, m.value)
} else {
fmt.Println("没有查找到数据!")
}

//添加key已经存在的数据
insertHashTable(&hashTable,0,666)
m = searchHashTable(&hashTable, 0)
if m != nil {
fmt.Printf("【%d】:%d\n", m.key, m.value)
} else {
fmt.Println("没有查找到数据!")
}

//删除数据元素
deleteHashTable(&hashTable, 0)

//删除之后 再次查找
m = searchHashTable(&hashTable, 0)
if m != nil {
fmt.Printf("【%d】:%d\n", m.key, m.value)
} else {
fmt.Println("没有查找到数据!")
}

}

-------------本文结束感谢您的阅读-------------

本文标题:数据结构--散列表(哈希表)2

文章作者:Wuman

发布时间:2018年09月06日 - 12:09

最后更新:2018年09月06日 - 13:09

原始链接:http://yoursite.com/2018/09/06/数据结构散列表哈希表2/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。