c++设计散列表实现电话号码查找系统。 【基本要求】 1) 设每个记录有下列数据项:
时间: 2023-11-25 13:03:15 浏览: 108
电话号码,姓名,地址。
2) 设电话号码为关键字,并且用除略静值除略把得静名除方式除离散址,。
3) 采用链地址法处理冲突。
4) 用适当方法计算散列表的装填因子和冲突率。
首先,我们需要设计一个散列函数,以电话号码作为关键字。这个散列函数可以是简单的取余数法,将电话号码除以表的大小,得到的余数即为该电话号码在散列表中的位置。
接下来,在每个记录中存储电话号码、姓名和地址等数据项。当有新的电话号码需要添加进系统时,我们可以根据散列函数计算出其在散列表中的位置,然后将其添加到该位置对应的链表中。
为了处理冲突,我们采用链地址法,即在散列表的每个位置上都维护一个链表,当有多个记录映射到同一个位置时,将它们添加到对应位置的链表中。
在实现中,我们需要计算散列表的装填因子和冲突率,以便及时调整表的大小和重新散列,以保证系统的性能。
通过这样的设计,我们可以实现一个高效的电话号码查找系统,可以快速地根据电话号码查找到对应的姓名和地址等信息,同时保证系统的性能和可扩展性。
相关问题
5、哈希表的设计与实现——链地址法 问题描述: 设计哈希表实现电话号码查找系统。 基本要求: (1)设每个记录有下列数据项:电话号码、用户名、地址; (2)从键盘输入各记录,分别以电话号码和用户名为关键字建立不同的哈希表; (3)采用链地址法解决冲突; (4)查找并显示给定电话号码的记录; (5)查找并显示给定用户名的记录。(c++代码)
以下是基于链地址法的哈希表实现电话号码查找系统的 C++ 代码:
```cpp
#include <iostream>
#include <string>
#define MAX_SIZE 100 // 哈希表的最大长度
using namespace std;
// 记录类
class Record {
public:
string phone;
string name;
string address;
};
// 链表节点类
class ListNode {
public:
Record data;
ListNode* next;
};
// 哈希表类
class HashTable {
private:
int size; // 哈希表长度
ListNode* table[MAX_SIZE]; // 哈希表数组
int Hash(string key); // 哈希函数
public:
HashTable(); // 构造函数
~HashTable(); // 析构函数
void Insert(Record rec); // 插入记录
Record* FindByPhone(string phone); // 根据电话号码查找记录
Record* FindByName(string name); // 根据用户名查找记录
};
// 哈希函数
int HashTable::Hash(string key) {
int sum = 0;
for (int i = 0; i < key.size(); i++) {
sum += key[i];
}
return sum % size;
}
// 构造函数
HashTable::HashTable() {
size = MAX_SIZE;
for (int i = 0; i < size; i++) {
table[i] = nullptr;
}
}
// 析构函数
HashTable::~HashTable() {
for (int i = 0; i < size; i++) {
ListNode* p = table[i];
while (p != nullptr) {
ListNode* q = p->next;
delete p;
p = q;
}
}
}
// 插入记录
void HashTable::Insert(Record rec) {
int index = Hash(rec.phone);
ListNode* p = table[index];
ListNode* q = nullptr;
while (p != nullptr) {
q = p;
p = p->next;
}
p = new ListNode;
p->data = rec;
p->next = nullptr;
if (q == nullptr) {
table[index] = p;
} else {
q->next = p;
}
}
// 根据电话号码查找记录
Record* HashTable::FindByPhone(string phone) {
int index = Hash(phone);
ListNode* p = table[index];
while (p != nullptr) {
if (p->data.phone == phone) {
return &p->data;
}
p = p->next;
}
return nullptr;
}
// 根据用户名查找记录
Record* HashTable::FindByName(string name) {
for (int i = 0; i < size; i++) {
ListNode* p = table[i];
while (p != nullptr) {
if (p->data.name == name) {
return &p->data;
}
p = p->next;
}
}
return nullptr;
}
int main() {
HashTable phoneBook; // 创建电话簿哈希表
// 从键盘输入记录,并插入哈希表中
Record rec;
cout << "请输入每个记录的电话号码、用户名和地址,以空格分隔:" << endl;
for (int i = 0; i < MAX_SIZE; i++) {
cin >> rec.phone >> rec.name >> rec.address;
if (rec.phone == "0") {
break; // 输入0结束输入
}
phoneBook.Insert(rec);
}
// 根据电话号码查找记录
string phoneNum;
cout << "请输入要查找的电话号码:" << endl;
cin >> phoneNum;
Record* pRec = phoneBook.FindByPhone(phoneNum);
if (pRec == nullptr) {
cout << "未找到该电话号码的记录。" << endl;
} else {
cout << "电话号码:" << pRec->phone << endl;
cout << "用户名:" << pRec->name << endl;
cout << "地址:" << pRec->address << endl;
}
// 根据用户名查找记录
string userName;
cout << "请输入要查找的用户名:" << endl;
cin >> userName;
pRec = phoneBook.FindByName(userName);
if (pRec == nullptr) {
cout << "未找到该用户名的记录。" << endl;
} else {
cout << "电话号码:" << pRec->phone << endl;
cout << "用户名:" << pRec->name << endl;
cout << "地址:" << pRec->address << endl;
}
return 0;
}
```
注意:本代码实现中使用了固定长度的哈希表,若要实现动态扩容,需要考虑重新哈希的问题。
c++散列表实现电话号码查询系统
好的,我可以为您介绍一下如何使用 C++ 实现电话号码查询系统的散列表。
散列表是一种用于快速查询数据的数据结构,它将数据存储在数组中,并使用哈希函数将数据映射到数组中的索引位置。在电话号码查询系统中,我们可以将每个电话号码作为键,将联系人信息存储为值,然后使用散列表来快速查找联系人信息。
以下是一个简单的 C++ 代码示例,用于实现基于散列表的电话号码查询系统:
```cpp
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main() {
// 创建一个散列表,用于存储电话号码和联系人信息
unordered_map<string, string> phoneBook;
// 添加一些联系人信息
phoneBook["111-222-3333"] = "Alice";
phoneBook["222-333-4444"] = "Bob";
phoneBook["333-444-5555"] = "Charlie";
// 从用户输入中查找联系人信息
string phoneNumber;
cout << "Enter a phone number (xxx-xxx-xxxx): ";
cin >> phoneNumber;
// 查找电话号码对应的联系人信息
auto it = phoneBook.find(phoneNumber);
if (it != phoneBook.end()) {
cout << "Contact name: " << it->second << endl;
} else {
cout << "Contact not found." << endl;
}
return 0;
}
```
在上面的代码中,我们首先创建了一个 `unordered_map` 对象,用于存储电话号码和联系人信息。然后,我们向电话簿中添加了一些联系人信息。
在查询联系人信息时,我们首先从用户输入中获取电话号码,然后使用散列表的 `find()` 函数来查找电话号码对应的联系人信息。如果找到了联系人信息,我们就输出联系人的姓名;否则,我们输出“联系人未找到”的提示信息。
希望这个简单的代码示例可以对您有所帮助。如果您有任何问题,请随时问我。