void FindName() { char name[20] = {0}; int hashCode = 0, si = 1; printf("\n请输入要查找的姓名的拼音:"); scanf("%s", name); getchar(); hashCode = gethashCode(name); int adr = hashCode % P; if (Hash[adr].key == 0) { printf("\n没有找到该姓名!\n"); return; } if (Hash[adr].key == hashCode && strcmp(Hash[adr].name, name) == 0) { printf("\n姓名:%s 关键字:%d 地址:%d 查找长度为: 1\n", Hash[adr].name, hashCode, adr); } else { int currAddr = adr; do { si++; adr = (adr + 1) % HASH_LEN; if (Hash[adr].key == hashCode && strcmp(Hash[adr].name, name) == 0) { printf("\n姓名:%s 关键字:%d 地址:%d 查找长度为:%d\n", Hash[adr].name, hashCode, adr, si); break; } } while (adr != currAddr); if (adr == currAddr) { printf("\n没有找到该姓名!\n"); return; } } }
时间: 2024-01-19 10:02:55 浏览: 11
这段代码实现了一个基于散列表的姓名查找函数。用户输入要查找的姓名的拼音,然后计算出该姓名对应的哈希值,再根据哈希值找到对应的散列表地址,如果该地址处的元素的关键字与计算出的哈希值相等且姓名也相等,则找到了该姓名,否则就需要在散列表中向后遍历,直到找到该姓名或者遍历完所有元素为止。如果最终还是没有找到该姓名,则输出相应的提示信息。
函数中用到了一个名为gethashCode()的函数,它的作用是计算字符串的哈希值。整个函数的实现比较简单,但需要注意的是,如果散列表中的元素个数很少,而哈希表的长度又很大时,会造成很多空间浪费,因为大部分散列表中的元素都是空的。因此,在实际应用中,需要根据实际情况来选择哈希表的长度和哈希函数的设计。
相关问题
0_10_java中==和equals和hashcode的区别
在Java中,"=="、equals()和hashCode()是用于比较对象的三个不同的方法。
首先,"=="是一个比较运算符,用于比较两个对象的引用是否相等。如果两个对象引用相同,则返回true;否则,返回false。这意味着它仅比较对象的内存地址。例如:
```
String a = "abc";
String b = "abc";
System.out.println(a == b); // 返回true,因为a和b引用相同的对象
```
其次,equals()是Object类的方法,被继承到其他类中。它用于比较两个对象的内容是否相等。默认情况下,equals()使用"=="来判断两个对象的引用是否相等。但是,可以通过重写equals()方法来改变比较规则。例如:
```
String a = "abc";
String b = "abc";
System.out.println(a.equals(b)); // 返回true,因为a和b的内容相等
```
最后,hashCode()是Object类的方法,用于获取一个对象的哈希码。哈希码是一个整数值,在哈希表等数据结构中用于快速查找。在默认情况下,hashCode()方法返回对象的内存地址的哈希码。hashCode()方法在需要使用哈希表存储对象时经常被用到。例如:
```
String a = "abc";
System.out.println(a.hashCode()); // 返回一个整数哈希码
```
总结起来,"=="用于比较两个对象的引用是否相等,equals()用于比较两个对象的内容是否相等,而hashCode()则用于获取对象的哈希码。在某些情况下,我们可能需要重写equals()和hashCode()方法,以便根据对象的特定属性进行比较和哈希码的生成。
==和equles 和hashcode 的区别
"=="、equals()和hashCode()都是Java中用于比较对象的方法,但它们之间有一些重要的区别。
1. "=="运算符:用于比较两个对象的引用是否相同。如果两个对象的引用指向同一个内存地址,则返回true;否则返回false。
2. equals()方法:用于比较两个对象的内容是否相等。equals()方法是Object类中的方法,可以被子类覆盖重写以实现自定义的相等判断逻辑。默认情况下,equals()方法与"=="运算符的行为相同,即比较两个对象的引用是否相同。
3. hashCode()方法:用于获取对象的哈希码值。hashCode()方法也是Object类中的方法,可以被子类覆盖重写以实现自定义的哈希算法。哈希码是一个整数,它代表了对象的特征信息。在使用一些基于哈希表的数据结构(如HashMap、HashSet等)时,hashCode()方法用于确定对象在哈希表中的存储位置。
区别:
- "=="比较的是两个对象的引用,即内存地址,用于判断两个对象是否指向同一个实例。
- equals()比较的是两个对象的内容,可以根据需要自定义判断逻辑。一般来说,如果重写equals()方法,就应该同时重写hashCode()方法。
- hashCode()返回一个整数,用于确定对象在哈希表中的存储位置。两个相等的对象必须具有相同的哈希码,但两个哈希码相等的对象不一定相等。
在使用自定义类作为HashMap的键时,通常要同时重写equals()和hashCode()方法,以保证对象能正确地存储和检索。