初阶数据结构:通讯录项目(可用作课程设计)

通讯录项目是初阶数据结构学习的经典案例,可以帮助学生掌握常见数据结构的使用,如链表、数组、哈希表等。通过设计并实现一个简单的通讯录管理系统,学生可以深入理解如何通过数据结构存储和管理联系人信息,进行增、删、查、改等操作。

本项目的目标是:设计一个通讯录管理系统,可以进行如下操作:

  1. 添加联系人:向通讯录中添加新联系人。
  2. 删除联系人:删除指定的联系人。
  3. 查询联系人:根据姓名、电话或其他字段查询联系人。
  4. 修改联系人:更新联系人的信息。
  5. 显示所有联系人:列出通讯录中的所有联系人。

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. 总结

这个通讯录项目通过实现基础的增、删、查、改、列出操作,帮助学生掌握数据结构的基本应用。通过这个项目,学生可以:

  • 理解哈希表的基本原理,如何用它来存储和管理联系人信息。
  • 学会如何实现文件的读写操作,保持数据持久化。
  • 熟悉如何处理用户输入和验证,以及如何设计简单的用户界面。

对于课程设计来说,这个项目的实现不仅能帮助学生掌握数据结构的实际应用,还能为更复杂的系统设计打下基础。