初阶数据结构:通讯录项目(可用作课程设计)
通讯录项目是初阶数据结构学习的经典案例,可以帮助学生掌握常见数据结构的使用,如链表、数组、哈希表等。通过设计并实现一个简单的通讯录管理系统,学生可以深入理解如何通过数据结构存储和管理联系人信息,进行增、删、查、改等操作。
本项目的目标是:设计一个通讯录管理系统,可以进行如下操作:
- 添加联系人:向通讯录中添加新联系人。
 - 删除联系人:删除指定的联系人。
 - 查询联系人:根据姓名、电话或其他字段查询联系人。
 - 修改联系人:更新联系人的信息。
 - 显示所有联系人:列出通讯录中的所有联系人。
 
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. 总结
这个通讯录项目通过实现基础的增、删、查、改、列出操作,帮助学生掌握数据结构的基本应用。通过这个项目,学生可以:
- 理解哈希表的基本原理,如何用它来存储和管理联系人信息。
 - 学会如何实现文件的读写操作,保持数据持久化。
 - 熟悉如何处理用户输入和验证,以及如何设计简单的用户界面。
 
对于课程设计来说,这个项目的实现不仅能帮助学生掌握数据结构的实际应用,还能为更复杂的系统设计打下基础。
发表回复