通讯录管理系统的设计与实现——哈希表
时间: 2023-09-20 15:06:34 浏览: 148
通讯录管理系统可以使用哈希表来实现,具体步骤如下:
1. 定义通讯录信息的结构体,包括姓名、手机、QQ、电子邮箱、城市、邮编等信息。
2. 定义哈希表结构体,包括哈希表大小、哈希表数组等成员变量。
3. 定义哈希函数,将通讯录信息的关键字(如姓名、手机等)转化为哈希表数组下标。
4. 实现添加信息功能,将新的通讯录信息插入到哈希表中。
5. 实现显示信息功能,可以按照手机或联系人的姓名拼音排序显示。可以定义一个排序函数,对哈希表中的信息进行排序,然后依次输出。
6. 实现查找功能,可用不同的关键字作为查找的依据,进行查找。可以根据关键字计算哈希表数组下标,然后在哈希表中查找对应的通讯录信息。
7. 实现编辑信息功能,可以根据姓名或手机等关键字,找到对应的通讯录信息,然后进行编辑。
8. 实现删除信息功能,可以根据姓名或手机等关键字,找到对应的通讯录信息,然后进行删除。
9. 实现保存到文件功能,将哈希表中的所有通讯录信息保存到文件中,以便下次程序启动时读取。
需要注意的是,哈希表中可能存在哈希冲突的情况,需要考虑如何解决冲突。可以采用链表法等解决冲突的方法。此外,通讯录管理系统界面应该友好,方便用户操作,可以使用图形界面或命令行界面。
相关问题
哈希表设计与实现——链表法
哈希表是一种高效的数据结构,可以用来存储和查找键值对。其中,哈希函数将键映射到一个特定的桶中,每个桶中存储一组键值对。在哈希表中,如果两个键被映射到同一个桶中,就会发生碰撞。为了解决这个问题,可以使用链表法。
链表法是一种解决哈希表碰撞问题的方法。具体来说,对于哈希表中的每个桶,可以使用一个链表来存储所有映射到该桶的键值对。如果发生碰撞,只需要将新的键值对添加到链表的末尾即可。
下面是一个使用链表法实现哈希表的示例代码:
```python
class Node:
def __init__(self, key, value):
self.key = key
self.value = value
self.next = None
class HashTable:
def __init__(self, capacity):
self.capacity = capacity
self.buckets = [None] * capacity
def hash_function(self, key):
return hash(key) % self.capacity
def put(self, key, value):
index = self.hash_function(key)
node = self.buckets[index]
while node:
if node.key == key:
node.value = value
return
node = node.next
new_node = Node(key, value)
new_node.next = self.buckets[index]
self.buckets[index] = new_node
def get(self, key):
index = self.hash_function(key)
node = self.buckets[index]
while node:
if node.key == key:
return node.value
node = node.next
return None
def remove(self, key):
index = self.hash_function(key)
node = self.buckets[index]
prev = None
while node:
if node.key == key:
if prev:
prev.next = node.next
else:
self.buckets[index] = node.next
return
prev = node
node = node.next
```
在这个示例中,我们定义了一个Node类来表示哈希表中的每个节点,每个节点包含一个键、一个值和一个指向下一个节点的指针。我们还定义了一个HashTable类来实现哈希表,其中包含一个桶数组和一些基本的操作方法,如put、get和remove。
在put方法中,我们首先使用哈希函数计算出键的索引,然后遍历桶中的链表,查找该键是否已经存在于哈希表中。如果找到了该键,我们只需要更新其对应的值即可。否则,我们创建一个新的节点,并将其添加到链表的开头。
在get方法中,我们同样使用哈希函数计算出键的索引,然后遍历桶中的链表,查找该键的值。如果找到了该键,我们返回其对应的值。否则,返回None。
在remove方法中,我们首先使用哈希函数计算出键的索引,然后遍历桶中的链表,查找该键。如果找到了该键,我们将其从链表中删除即可。
总的来说,链表法是一种简单且常用的哈希表解决碰撞问题的方法。
数据结构课程设计通讯录管理系统哈希表
通讯录管理系统可以使用哈希表来实现快速的电话号码查找。下面是一个简单的示例代码,演示了如何使用哈希表来实现通讯录管理系统:
```python
class Contact:
def __init__(self, phone_number, username, address):
self.phone_number = phone_number
self.username = username
self.address = address
class HashTable:
def __init__(self):
self.table = {}
def insert(self, contact):
key = contact.phone_number
if key not in self.table:
self.table[key] = contact
def search_by_phone_number(self, phone_number):
if phone_number in self.table:
return self.table[phone_number]
else:
return None
def search_by_username(self, username):
for contact in self.table.values():
if contact.username == username:
return contact
return None
# 创建哈希表
phone_number_table = HashTable()
username_table = HashTable()
# 从文件中读取记录并插入哈希表
with open('contacts.txt', 'r') as file:
for line in file:
phone_number, username, address = line.strip().split(',')
contact = Contact(phone_number, username, address)
phone_number_table.insert(contact)
username_table.insert(contact)
# 根据电话号码查找联系人
phone_number = '1234567890'
contact = phone_number_table.search_by_phone_number(phone_number)
if contact:
print(f"Contact found - Phone Number: {contact.phone_number}, Username: {contact.username}, Address: {contact.address}")
else:
print("Contact not found")
# 根据用户名查找联系人
username = 'John Doe'
contact = username_table.search_by_username(username)
if contact:
print(f"Contact found - Phone Number: {contact.phone_number}, Username: {contact.username}, Address: {contact.address}")
else:
print("Contact not found")
```
这个示例代码中,我们定义了一个Contact类来表示每个联系人的信息。然后,我们创建了两个哈希表,一个以电话号码为关键字,另一个以用户名为关键字。我们从文件中读取记录,并将每个记录插入到两个哈希表中。最后,我们可以根据电话号码或用户名来查找联系人。