void PrintKeys(HashTable ht, void(*print)(StrKeyType)){
// 从字母’A‘开始,按顺序输出哈希表中的所有的关键字
// for循环中的i代表字母表中字母所处位置的下标
for (int i = 0; i < 26; i++) {
// 计算当前字母在哈希表中应该存储的位置
int location = i % ht.size;
// 判断当前位置是不是空
// 如果是空,就说明哈希表中没有以这个下标对应的字母为开头的关键字
// 那么无需输出
if (ht.rcd[location].tag == 0) {
continue;
}
else {
// 如果非空,就说明当前位置有存储关键字
// 但是不能确保当前位置的关键字一定以当前字母开头(有可能是别的位置的关键字因为冲突而存储到当前位置)
// 所以需要判断当前位置的关键字的开头字母是不是当前字母
// 另一方面,需要向后遍历数组,来输出所有的以当前字母为开头的关键字
// 直至rcd的某个位置的关键字被标记为空或者已删除
RcdType2 pointer = ht.rcd[location];
int index = location;
while (pointer.tag != 0) {
// 如果当前位置的关键字以当前字母开头,就输出这个关键字
if (pointer.key[0] == (char)(i + 65) && pointer.tag != -1) {
print(pointer.key);
}
// 继续探测下一个位置
index = (index + 1) % ht.size;
pointer = ht.rcd[index];
}
}
}
}