问题描述:针对某个单位电话号码簿,设计一个哈希表,并完成相应的建表和查表程序。基本要求:设每个记录有下列数据项:电话号码、用户名、住址。从键盘输入各记录,以用户名为关键字建立哈希表,哈希函数用除留取余数法构造,采用线性探测法解决冲突。可以插入、查找、删除并显示给定用户名的记录,并计算查找长度, 哈希表保存到文件中。测试数据:取某个单位电话号码簿中的30 个记录。提高要求:将电话号码薄以文件形式保存到盘上,能够按用户名和电话号码两种形式建立哈希表并实现插入、查找、删除表中元素的功能。
时间: 2023-12-10 21:41:30 浏览: 109
以下是Python实现的代码,其中使用了pickle模块将哈希表保存到文件中:
```python
import pickle
# 定义哈希表的大小
HASH_SIZE = 100
# 定义哈希表中每个记录的数据结构
class Record:
def __init__(self, phone_num, username, address):
self.phone_num = phone_num
self.username = username
self.address = address
def __str__(self):
return f"{self.username} {self.phone_num} {self.address}"
# 定义哈希表类
class HashTable:
def __init__(self):
self.table = [None] * HASH_SIZE
# 定义哈希函数
def hash(self, key):
return sum([ord(c) for c in key]) % HASH_SIZE
# 定义插入操作
def insert(self, record):
key = record.username
index = self.hash(key)
while self.table[index] is not None:
if self.table[index].username == key:
return False
index = (index + 1) % HASH_SIZE
self.table[index] = record
return True
# 定义查找操作
def find(self, username):
index = self.hash(username)
count = 0
while self.table[index] is not None:
count += 1
if self.table[index].username == username:
return self.table[index], count
index = (index + 1) % HASH_SIZE
return None, count
# 定义删除操作
def delete(self, username):
index = self.hash(username)
while self.table[index] is not None:
if self.table[index].username == username:
self.table[index] = None
return True
index = (index + 1) % HASH_SIZE
return False
# 定义显示操作
def display(self):
for record in self.table:
if record is not None:
print(record)
# 定义保存到文件操作
def save_to_file(self, filename):
with open(filename, 'wb') as f:
pickle.dump(self.table, f)
# 定义从文件加载操作
def load_from_file(self, filename):
with open(filename, 'rb') as f:
self.table = pickle.load(f)
# 主程序
if __name__ == '__main__':
# 创建哈希表
table = HashTable()
# 输入记录
records = []
for i in range(30):
phone_num = input("请输入电话号码:")
username = input("请输入用户名:")
address = input("请输入住址:")
record = Record(phone_num, username, address)
records.append(record)
# 插入记录
for record in records:
table.insert(record)
# 显示记录
table.display()
# 保存哈希表到文件
table.save_to_file("hash_table.dat")
# 从文件加载哈希表
table.load_from_file("hash_table.dat")
# 按用户名查找记录
username = input("请输入要查找的用户名:")
record, count = table.find(username)
if record is not None:
print(f"查找成功,{record}")
print(f"查找长度为{count}")
else:
print("查找失败")
# 按用户名删除记录
username = input("请输入要删除的用户名:")
if table.delete(username):
print("删除成功")
else:
print("删除失败")
# 显示记录
table.display()
```
可以将上述代码保存到文件中,运行即可进行测试。
阅读全文