1 /************************************************************************
2 用c实现HASH表创建、插入、查找、删除、打印
3
4 转载文章
5 ************************************************************************/
6 #include <stdio.h>
7 #include <STDLIB.H>
8 #include <MEMORY.H>
9
10 #define STATUS int
11 #define FALSE 0
12 #define TRUE 1
13 #define VOID void
14
15 /****************************************
16 a)定义hash表和基本数据节点
17 *****************************************/
18 typedef struct _Node
19 {
20 int data;
21 struct _Node *next;
22 }NODE;
23
24 typedef struct _HASH_TABLE
25 {
26 NODE * value[10];
27 }HASH_TABLE;
28
29
30 /****************************************
31 b)创建hash表
32 *****************************************/
33 HASH_TABLE * create_hash_table()
34 {
35 HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
36 memset(pHashTbl,0,sizeof(HASH_TABLE));
37 return pHashTbl;
38 }
39
40
41 /****************************************
42 c)在hash表当中寻找数据
43 *****************************************/
44 NODE * find_data_in_hash(HASH_TABLE* pHashTbl,int data)
45 {
46 NODE* pNode;
47 if (NULL == pHashTbl)
48 {
49 return NULL;
50 }
51
52 /*获得HASH表索引,为NULL则直接返回NULL*/
53 if (NULL == (pNode = pHashTbl->value[data%10]))
54 {
55 return NULL;
56 }
57
58 /*在该索引下的单链表中查找节点*/
59 while(pNode)
60 {
61 if ( data == pNode->data)
62 {
63 /*找到节点就返回当前节点*/
64 return pNode;
65 }
66 /*当前节点不是,指向下一节点*/
67 pNode = pNode->next;
68 }
69
70 /*没找到返回NULL,不过在这返回没有意义*/
71 //return NULL;
72 }
73
74 /****************************************
75 d)在hash表当中插入数据
76 *****************************************/
77 STATUS insert_data_into_hash(HASH_TABLE* pHashTbl,int data)
78 {
79 NODE* pNode;
80 if (NULL == pHashTbl)
81 {
82 return FALSE;
83 }
84
85 if (NULL == pHashTbl->value[data%10])
86 {
87 pNode = (NODE*)malloc(sizeof(NODE));
88 memset(pNode,0,sizeof(NODE));
89 pNode->data = data;
90 pHashTbl->value[data%10] = pNode;
91
92 return TRUE;
93 }
94
95 if (NULL == find_data_in_hash(pHashTbl,data))
96 {
97 return FALSE;
98 }
99
100 pNode = pHashTbl->value[data%10];
101 while(pNode->next)
102 {
103 pNode = pNode->next;
104 }
105
106 pNode->next = (NODE*)malloc(sizeof(NODE));
107 memset(pNode->next,0,sizeof(NODE));
108 pNode->next->data = data;
109
110 return TRUE;
111 }
112
113 /****************************************
114 e)从hash表中删除数据
115 *****************************************/
116 STATUS delete_data_from_hash(HASH_TABLE* pHashTbl,int data)
117 {
118 NODE* pHead;
119 NODE* pNode;
120
121 if (NULL == pHashTbl || NULL == pHashTbl->value[data%10])
122 {
123 return FALSE;
124 }
125
126 if (NULL == (pNode = find_data_in_hash(pHashTbl,data)))
127 {
128 return FALSE;
129 }
130
131 if (pNode == pHashTbl->value[data%10])
132 {
133 pHashTbl->value[data%10] = pNode->next;
134 goto final;
135 }
136
137 pHead = pHashTbl->value[data%10];
138
139 while(pNode != pHead->next)
140 {
141 pHead = pHead->next;
142 }
143
144 pHead->next = pNode->next;
145
146 final:
147 free(pNode);
148 return TRUE;
149 }
150
151
152 /****************************************
153 f)打印hash表中所有数据
154 如:
155 [Hash idx] [value]
156 0-------------NULL
157 1-------------1 251
158 2-------------22
159 3-------------123 43
160 4-------------NULL
161 5-------------55 15 235 525 725 275 545
162 6-------------NULL
163 7-------------257
164 8-------------NULL
165 *****************************************/
166 VOID print_hash_data(HASH_TABLE* pHashTbl)
167 {
168 NODE* pNode;
169 int i=0;
170 if (NULL == pHashTbl)
171 {
172 printf("ERROR:The hash is NULL\n");
173 }
174
175 /*
176 if (NULL == (pNode = pHashTbl->value[10]))
177 {
178 printf("ERROR:The hash node is NULL\n");
179 }
180 */
181 printf("[Hash idx] [value]\n");
182 do
183 {
184 printf(" %d-------------",i);
185 if (NULL == pHashTbl->value[i])
186 {
187 i++;
188 printf("NULL\n");
189 continue;
190 }
191
192 pNode = pHashTbl->value[i];
193
194 while(pNode)
195 {
196 printf("%d ",pNode->data);
197 pNode = pNode->next;
198 }
199 printf("\n");
200 i++;
201 } while (i<10);
202
203 printf("\n");
204 }
205
206 int main()
207 {
208 HASH_TABLE* pHashTbl = create_hash_table();
209
210 (VOID)insert_data_into_hash(pHashTbl,22);
211 (VOID)insert_data_into_hash(pHashTbl,22);
212 (VOID)insert_data_into_hash(pHashTbl,123);
213 (VOID)insert_data_into_hash(pHashTbl,436);
214 (VOID)insert_data_into_hash(pHashTbl,55);
215 (VOID)insert_data_into_hash(pHashTbl,157);
216 (VOID)insert_data_into_hash(pHashTbl,235);
217 (VOID)insert_data_into_hash(pHashTbl,256);
218 (VOID)insert_data_into_hash(pHashTbl,525);
219 (VOID)insert_data_into_hash(pHashTbl,724);
220 (VOID)insert_data_into_hash(pHashTbl,278);
221 (VOID)insert_data_into_hash(pHashTbl,209);
222 (VOID)insert_data_into_hash(pHashTbl,67);
223 (VOID)insert_data_into_hash(pHashTbl,54);
224 (VOID)insert_data_into_hash(pHashTbl,546);
225 (VOID)insert_data_into_hash(pHashTbl,350);
226 (VOID)insert_data_into_hash(pHashTbl,101);
227 (VOID)insert_data_into_hash(pHashTbl,23);
228
229 print_hash_data(pHashTbl);
230
231 (VOID)delete_data_from_hash(pHashTbl,55);
232
233 print_hash_data(pHashTbl);
234
235
236 return 0;
237 }