初阶数据结构:通讯录项目(可用作课程设计)
通讯录项目是初阶数据结构学习的经典案例,可以帮助学生掌握常见数据结构的使用,如链表、数组、哈希表等。通过设计并实现一个简单的通讯录管理系统,学生可以深入理解如何通过数据结构存储和管理联系人信息,进行增、删、查、改等操作。
本项目的目标是:设计一个通讯录管理系统,可以进行如下操作:
- 添加联系人:向通讯录中添加新联系人。
- 删除联系人:删除指定的联系人。
- 查询联系人:根据姓名、电话或其他字段查询联系人。
- 修改联系人:更新联系人的信息。
- 显示所有联系人:列出通讯录中的所有联系人。
1. 项目需求分析
1.1. 数据结构设计
通讯录中的每个联系人可以视为一个 节点,包含姓名、电话、电子邮件等基本信息。我们需要为这些联系人设计合适的数据结构,并且根据需求选择合适的数据存储方式(例如链表、数组、哈希表等)。
1.2. 功能设计
- 增:向通讯录中添加新的联系人。
- 删:根据姓名或电话删除联系人。
- 查:根据姓名、电话或其他字段查找联系人。
- 改:修改联系人的信息。
- 列出所有:显示所有联系人。
1.3. 输入输出设计
- 输入:用户输入姓名、电话、电子邮件等信息。
- 输出:显示匹配的联系人信息或所有联系人信息。
2. 数据结构选型
我们可以使用不同的数据结构来实现这个通讯录。为了简化设计并提高效率,我们选择使用 哈希表 来存储联系人信息。哈希表的查找、插入和删除操作都可以在平均 O(1)
的时间复杂度下完成,适合用来存储和查找联系人。
2.1. 联系人节点设计
每个联系人由以下信息组成:
- 姓名(
name
) - 电话(
phone
) - 电子邮件(
email
)
可以设计一个 联系人类:
class Contact:
def __init__(self, name, phone, email):
self.name = name
self.phone = phone
self.email = email
def __repr__(self):
return f"Name: {self.name}, Phone: {self.phone}, Email: {self.email}"
2.2. 哈希表存储通讯录
为了方便快速查找和修改联系人信息,我们使用 字典(HashMap) 来存储通讯录。键为联系人姓名(或电话号码),值为 Contact
类的实例。
class AddressBook:
def __init__(self):
self.contacts = {} # 用字典存储联系人
def add_contact(self, name, phone, email):
if name in self.contacts:
print(f"联系人 {name} 已存在!")
else:
self.contacts[name] = Contact(name, phone, email)
print(f"联系人 {name} 添加成功!")
def remove_contact(self, name):
if name in self.contacts:
del self.contacts[name]
print(f"联系人 {name} 删除成功!")
else:
print(f"联系人 {name} 不存在!")
def find_contact(self, name):
if name in self.contacts:
print(self.contacts[name])
else:
print(f"联系人 {name} 不存在!")
def update_contact(self, name, phone=None, email=None):
if name in self.contacts:
contact = self.contacts[name]
if phone:
contact.phone = phone
if email:
contact.email = email
print(f"联系人 {name} 信息更新成功!")
else:
print(f"联系人 {name} 不存在!")
def list_contacts(self):
if not self.contacts:
print("通讯录为空!")
else:
for contact in self.contacts.values():
print(contact)
3. 功能实现
3.1. 添加联系人
def add_contact(address_book):
name = input("请输入联系人姓名: ")
phone = input("请输入联系人电话: ")
email = input("请输入联系人电子邮件: ")
address_book.add_contact(name, phone, email)
3.2. 删除联系人
def remove_contact(address_book):
name = input("请输入要删除的联系人姓名: ")
address_book.remove_contact(name)
3.3. 查找联系人
def find_contact(address_book):
name = input("请输入要查找的联系人姓名: ")
address_book.find_contact(name)
3.4. 修改联系人
def update_contact(address_book):
name = input("请输入要修改的联系人姓名: ")
phone = input("请输入新的电话(可选,留空则不修改): ")
email = input("请输入新的电子邮件(可选,留空则不修改): ")
address_book.update_contact(name, phone, email)
3.5. 显示所有联系人
def list_contacts(address_book):
address_book.list_contacts()
4. 主程序
def main():
address_book = AddressBook()
while True:
print("\n----通讯录管理----")
print("1. 添加联系人")
print("2. 删除联系人")
print("3. 查找联系人")
print("4. 修改联系人")
print("5. 显示所有联系人")
print("6. 退出")
choice = input("请选择操作(1-6): ")
if choice == '1':
add_contact(address_book)
elif choice == '2':
remove_contact(address_book)
elif choice == '3':
find_contact(address_book)
elif choice == '4':
update_contact(address_book)
elif choice == '5':
list_contacts(address_book)
elif choice == '6':
print("退出程序...")
break
else:
print("无效的选择,请重新输入。")
5. 功能扩展与优化
5.1. 优化查询功能
目前查询是通过姓名进行的。如果我们要根据电话或电子邮件进行查询,可以在哈希表中建立多个索引,或者使用额外的哈希表进行映射。例如,可以使用一个额外的字典来映射电话和姓名之间的关系。
5.2. 数据持久化
当前的通讯录数据保存在内存中,如果程序关闭,数据会丢失。为了保持数据的持久性,可以将联系人信息保存到文件中(如 JSON 文件或 CSV 文件),每次程序启动时加载数据。
import json
def save_to_file(address_book):
with open('address_book.json', 'w') as file:
json.dump(address_book.contacts, file, default=str)
def load_from_file(address_book):
try:
with open('address_book.json', 'r') as file:
contacts = json.load(file)
for name, contact_info in contacts.items():
address_book.contacts[name] = Contact(contact_info['name'], contact_info['phone'], contact_info['email'])
except FileNotFoundError:
print("未找到数据文件,启动空通讯录。")
5.3. 输入验证
为了防止用户输入无效的电话号码或电子邮件,程序可以增加输入验证。例如,使用正则表达式验证电话号码的格式,电子邮件地址的格式等。
import re
def validate_phone(phone):
pattern = r'^[0-9]{10}$'
return re.match(pattern, phone) is not None
def validate_email(email):
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
return re.match(pattern, email) is not None
6. 总结
这个通讯录项目通过实现基础的增、删、查、改、列出操作,帮助学生掌握数据结构的基本应用。通过这个项目,学生可以:
- 理解哈希表的基本原理,如何用它来存储和管理联系人信息。
- 学会如何实现文件的读写操作,保持数据持久化。
- 熟悉如何处理用户输入和验证,以及如何设计简单的用户界面。
对于课程设计来说,这个项目的实现不仅能帮助学生掌握数据结构的实际应用,还能为更复杂的系统设计打下基础。
发表回复