HashSearch 的实现
下面这段代码的哈希实现体我觉得有不是很托的地方,哈希表建立最好只存放键值,不用把关键词结构也放进去,因为哈希表大小一般为关键词表的很多倍,为了散列效果好,你必须吧键值表高的大点以实现很好的散列。这里的程序把关键词也放进哈希表中但是却没用,我觉得不是很好的实现方式,分开,做成两个不同的表,实现效果可能更好~
1
/*
2
* Copyright (c) 2005 All rights reserved.
3
* 文件名:HashSearch.c
4
*
5
* 文件标识:HashSearch
6
* 摘要:一个简单的哈希表搜索示例
7
* 输入:员工的ID
8
* 输出:根据输入的ID查找员工资料并输出,若没有找到给出相应提示
9
*
10
* 当前版本 0.01
11
* 作者:罗
12
* 完成日期:2006年3月28日
13
*/
14
15
#include <stdio.h>
16
#include <stdlib.h>
17
#define HASHSIZE 11
18
19
/* 哈希表元素的结构定义 */
20
typedef struct
21
{
22
int ID;
23
char *name;
24
float salary;
25
} employee;
26
27
typedef employee DataType;
28
29
/* 定义一个全局的,元素类型为 employee 的哈希表 */
30
DataType Hash[HASHSIZE];
31
32
/*
33
函数名:Create_Hash
34
参数:employees为员工资料数组, size为数组大小
35
功能:将大小为size的员工资料数组按员工ID映射到Hash表
36
*/
37
void Create_Hash(DataType *employees, int size);
38
39
/*函数名:HashFun
40
参数:key为员工ID
41
功能:将员工ID映射为Hash表中的下标地址
42
返回值:返回给定关键字对应的Hash表下标地址
43
*/
44
int HashFun(int key);
45
46
/*函数名:HashSearch
47
参数:key为员工的ID
48
功能:在Hash表中搜索给定关键字的员工信息
49
返回值:找到返回1,并输出员工资料, 找不到返回0并提示没有找到
50
*/
51
int HashSearch(int key);
52
53
/*函数名:OverHandle
54
参数:address发生冲突Hash表下标地址
55
功能:
56
返回值:
57
*/
58
int OverHandle(int address);
59
60
/*函数名:printemployee
61
参数:一个员工资料结构的指针
62
功能:屏幕输出员工资料
63
返回值:无
64
*/
65
void printemployee(DataType *employee)
66
{
67
printf("ID : %d \t Name: %s\t Salary:%f\n",
68
employee->ID, employee->name, employee->salary);
69
}
70
71
int main(int argc, char* argv[])
72
{
73
int size;
74
int key1;
75
static char ch;
76
/* 员工资料数组 */
77
DataType employee[] = {
78
{11, "luojiafeng", 5000},
79
{37, "wangqian", 8000},
80
{48, "liujie", 6000},
81
{97, "gaoxing", 10000},
82
{86, "xiaozhen", 6000},
83
{26, "chenghu", 8800}
84
};
85
/* 数组元素个数 */
86
size = sizeof(employee) / sizeof(employee[0]);
87
88
/* 将员工资料数组映射到哈希表 */
89
Create_Hash(employee, size);
90
91
/* 输入一个员工的ID,查找并显示相关信息 */
92
printf("请输入一位员工的ID:\n");
93
scanf("%d", &key1);
94
HashSearch(key1);
95
}
96
97
void Create_Hash(DataType *employees, int size)
98
{
99
int i, j;
100
DataType empty = {0, NULL, 0.0};
101
for (i = 0; i < HASHSIZE; i++)
102
{
103
Hash[i] = empty;
104
}
105
for (i = 0; i < size; i++)
106
{
107
j = 0;
108
while (j < HASHSIZE)
109
{
110
/* 根据员工ID,将员工资料存放到哈表 */
111
if (Hash[(employees[i].ID % HASHSIZE) + j].ID == 0)
112
{
113
Hash[(employees[i].ID % HASHSIZE) + j] = employees[i];
114
break;
115
}
116
/* j++表示发生了冲突 */
117
else
118
j++;
119
}
120
}
121
}
122
123
int HashFun(int key)
124
{
125
return key % HASHSIZE;
126
}
127
128
DataType HashValue(int key)
129
{
130
return Hash[key % HASHSIZE];
131
}
132
133
int HashSearch(int key)
134
{
135
DataType temp;
136
int address, count = 0;
137
address = HashFun(key);
138
count++;
139
temp = HashValue(address);
140
if (temp.ID == key)
141
{
142
printemployee(&temp);
143
return 1;
144
}
145
else if (temp.ID == 0)
146
{
147
printf("没有找到与您输入ID相关的记录!\n");
148
return 0;
149
}
150
else
151
{
152
while (count < HASHSIZE)
153
{
154
address = OverHandle(address);
155
temp = HashValue(address);
156
if (temp.ID == key)
157
{
158
printemployee(&temp);
159
return 1;
160
}
161
count++;
162
}
163
}
164
return 0;
165
}
166
167
int OverHandle(int address)
168
{
169
return (address+1) % HASHSIZE;
170
}
171

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

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)