@@ -34,8 +34,8 @@ public class HashDemo {
3434 private final static int FAILED = 0xFFFFFFFF ;
3535
3636 public static void main (String [] args ) {
37- // int[] list = {3, 112, 245, 27, 44, 19, 76, 29, 90};
38- int [] list = { 1 , 9 , 25 , 11 , 12 , 35 , 17 , 29 };
37+ // int[] list = {3, 112, 245, 27, 44, 19, 76, 29, 90}
38+ int [] list = {1 , 9 , 25 , 11 , 12 , 35 , 17 , 29 }
3939 HashTable [] ha = new HashTable [MAXSIZE ];
4040 for (int i = 0 ; i < ha .length ; i ++) {
4141 ha [i ] = new HashTable ();
@@ -44,47 +44,56 @@ public static void main(String[] args) {
4444 HashDemo search = new HashDemo ();
4545 search .createHashTable (ha , list , MODULO , MAXSIZE );
4646 search .displayHashTable (ha );
47-
4847 }
4948
5049 /**
51- * 查找哈希表 构造哈希表采用除留取余法,即f(key) = key mod p (p ≤ size) 解决冲突采用开放定址法,即f2(key) = (f(key) +
52- * i) mod p (1 ≤ i ≤ size-1) ha为哈希表,p为模,size为哈希表大小,key为要查找的关键字
50+ * 创建哈希表 先将哈希表中各关键字清空,使其地址为开放的,然后调用插入算法将给定的关键字序列依次插入。
5351 */
54- private int searchHashTable (HashTable [] ha , int p , int size , int key ) {
55- // 采用除留取余法找哈希地址
56- int addr = key % p ;
52+ public void createHashTable (HashTable [] ha , int [] list , int p , int size ) {
53+ int i = 0 ;
5754
58- // 若发生冲突,用开放定址法找下一个哈希地址
59- while (ha [addr ].key != NULLKEY && ha [addr ].key != key ) {
60- addr = (addr + 1 ) % size ;
55+ // 将哈希表中的所有关键字清空
56+ for (i = 0 ; i < ha .length ; i ++) {
57+ ha [i ].key = NULLKEY ;
58+ ha [i ].count = 0 ;
6159 }
6260
63- if (ha [addr ].key == key ) {
64- // 查找成功
65- return addr ;
66- }
67- else {
68- // 查找失败
69- return FAILED ;
61+ // 将关键字序列依次插入哈希表中
62+ for (i = 0 ; i < list .length ; i ++) {
63+ this .insertHashTable (ha , p , size , list [i ]);
7064 }
7165 }
7266
7367 /**
74- * 删除哈希表中关键字为key的记录 找到要删除的记录,将关键字置为删除标记DELKEY
68+ * 输出哈希表
7569 */
76- public int deleteHashTable (HashTable [] ha , int p , int size , int key ) {
77- int addr = 0 ;
78- addr = searchHashTable (ha , p , size , key );
79- if (FAILED != addr ) {
80- // 将该位置的关键字置为DELKEY
81- ha [addr ].key = DELKEY ;
82- return SUCCESS ;
70+ private void displayHashTable (HashTable [] ha ) {
71+ int i = 0 ;
72+ System .out .format ("pos:\t " , "pos" );
73+ for (i = 0 ; i < ha .length ; i ++) {
74+ System .out .format ("%4d" , i );
8375 }
84- else {
85- // 查找不到记录,直接返回NULLKEY
86- return NULLKEY ;
76+ System .out .println ();
77+
78+ System .out .format ("key:\t " );
79+ for (i = 0 ; i < ha .length ; i ++) {
80+ if (ha [i ].key != NULLKEY ) {
81+ System .out .format ("%4d" , ha [i ].key );
82+ } else {
83+ System .out .format (" " );
84+ }
85+ }
86+ System .out .println ();
87+
88+ System .out .format ("count:\t " );
89+ for (i = 0 ; i < ha .length ; i ++) {
90+ if (0 != ha [i ].count ) {
91+ System .out .format ("%4d" , ha [i ].count );
92+ } else {
93+ System .out .format (" " );
94+ }
8795 }
96+ System .out .println ();
8897 }
8998
9099 /**
@@ -100,8 +109,7 @@ private void insertHashTable(HashTable[] ha, int p, int size, int key) {
100109 ha [addr ].key = key ;
101110 ha [addr ].count = 1 ;
102111 // 如果有冲突,使用开放定址法处理冲突
103- }
104- else {
112+ } else {
105113 do {
106114 // 寻找下一个哈希地址
107115 addr = (addr + 1 ) % size ;
@@ -115,55 +123,41 @@ private void insertHashTable(HashTable[] ha, int p, int size, int key) {
115123 }
116124
117125 /**
118- * 创建哈希表 先将哈希表中各关键字清空,使其地址为开放的,然后调用插入算法将给定的关键字序列依次插入。
126+ * 删除哈希表中关键字为key的记录 找到要删除的记录,将关键字置为删除标记DELKEY
119127 */
120- public void createHashTable (HashTable [] ha , int [] list , int p , int size ) {
121- int i = 0 ;
122-
123- // 将哈希表中的所有关键字清空
124- for (i = 0 ; i < ha .length ; i ++) {
125- ha [i ].key = NULLKEY ;
126- ha [i ].count = 0 ;
127- }
128-
129- // 将关键字序列依次插入哈希表中
130- for (i = 0 ; i < list .length ; i ++) {
131- this .insertHashTable (ha , p , size , list [i ]);
128+ public int deleteHashTable (HashTable [] ha , int p , int size , int key ) {
129+ int addr = 0 ;
130+ addr = searchHashTable (ha , p , size , key );
131+ if (FAILED != addr ) {
132+ // 将该位置的关键字置为DELKEY
133+ ha [addr ].key = DELKEY ;
134+ return SUCCESS ;
135+ } else {
136+ // 查找不到记录,直接返回NULLKEY
137+ return NULLKEY ;
132138 }
133139 }
134140
135141 /**
136- * 输出哈希表
142+ * 查找哈希表 构造哈希表采用除留取余法,即f(key) = key mod p (p ≤ size) 解决冲突采用开放定址法,即f2(key) = (f(key) + i) mod p (1 ≤ i ≤ size-1)
143+ * ha为哈希表,p为模,size为哈希表大小,key为要查找的关键字
137144 */
138- private void displayHashTable (HashTable [] ha ) {
139- int i = 0 ;
140- System .out .format ("pos:\t " , "pos" );
141- for (i = 0 ; i < ha .length ; i ++) {
142- System .out .format ("%4d" , i );
143- }
144- System .out .println ();
145+ private int searchHashTable (HashTable [] ha , int p , int size , int key ) {
146+ // 采用除留取余法找哈希地址
147+ int addr = key % p ;
145148
146- System .out .format ("key:\t " );
147- for (i = 0 ; i < ha .length ; i ++) {
148- if (ha [i ].key != NULLKEY ) {
149- System .out .format ("%4d" , ha [i ].key );
150- }
151- else {
152- System .out .format (" " );
153- }
149+ // 若发生冲突,用开放定址法找下一个哈希地址
150+ while (ha [addr ].key != NULLKEY && ha [addr ].key != key ) {
151+ addr = (addr + 1 ) % size ;
154152 }
155- System .out .println ();
156153
157- System .out .format ("count:\t " );
158- for (i = 0 ; i < ha .length ; i ++) {
159- if (0 != ha [i ].count ) {
160- System .out .format ("%4d" , ha [i ].count );
161- }
162- else {
163- System .out .format (" " );
164- }
154+ if (ha [addr ].key == key ) {
155+ // 查找成功
156+ return addr ;
157+ } else {
158+ // 查找失败
159+ return FAILED ;
165160 }
166- System .out .println ();
167161 }
168162
169163}
0 commit comments