返回

C 语言链表实现通讯录管理系统(完整版)

开发工具

引言

通讯录管理系统是一种用于存储和管理个人或组织的联系信息的软件系统。它可以帮助用户轻松地查找和管理联系人,并可以通过多种方式与联系人进行沟通。

链表是一种常用的数据结构,它由一组具有相同类型的元素组成,每个元素都包含一个数据项和一个指向下一个元素的指针。链表可以用来存储和管理各种类型的数据,包括联系人信息。

使用 C 语言实现的通讯录管理系统是一个很好的项目,可以帮助你巩固对 C 语言的基础知识,并学习如何使用链表数据结构。

系统设计

在开始编写代码之前,我们需要先设计一下我们的系统。我们要考虑以下几点:

  • 数据结构: 我们将使用链表数据结构来存储联系人信息。每个联系人都有一个姓名、电话号码和电子邮件地址。
  • 功能: 我们的系统需要能够完成以下功能:
    • 添加新联系人
    • 删除联系人
    • 修改联系人信息
    • 查找联系人
    • 显示所有联系人
  • 用户界面: 我们的系统将使用命令行界面。用户可以通过输入命令来与系统进行交互。

代码实现

#include <stdio.h>
#include <stdlib.h>

// 定义联系人结构体
typedef struct contact {
    char *name;
    char *phone_number;
    char *email_address;
    struct contact *next;
} contact;

// 定义通讯录结构体
typedef struct address_book {
    contact *head;
    contact *tail;
    int size;
} address_book;

// 创建通讯录
address_book *create_address_book() {
    address_book *address_book = malloc(sizeof(address_book));
    address_book->head = NULL;
    address_book->tail = NULL;
    address_book->size = 0;
    return address_book;
}

// 添加联系人
void add_contact(address_book *address_book, char *name, char *phone_number, char *email_address) {
    // 创建新的联系人
    contact *new_contact = malloc(sizeof(contact));
    new_contact->name = name;
    new_contact->phone_number = phone_number;
    new_contact->email_address = email_address;
    new_contact->next = NULL;

    // 将新的联系人添加到通讯录
    if (address_book->size == 0) {
        address_book->head = new_contact;
        address_book->tail = new_contact;
    } else {
        address_book->tail->next = new_contact;
        address_book->tail = new_contact;
    }

    // 增加通讯录的大小
    address_book->size++;
}

// 删除联系人
void delete_contact(address_book *address_book, char *name) {
    // 查找要删除的联系人
    contact *current_contact = address_book->head;
    contact *previous_contact = NULL;
    while (current_contact != NULL && strcmp(current_contact->name, name) != 0) {
        previous_contact = current_contact;
        current_contact = current_contact->next;
    }

    // 如果找到了要删除的联系人,则将其删除
    if (current_contact != NULL) {
        if (previous_contact == NULL) {
            address_book->head = current_contact->next;
        } else {
            previous_contact->next = current_contact->next;
        }

        if (current_contact == address_book->tail) {
            address_book->tail = previous_contact;
        }

        // 释放要删除的联系人的内存
        free(current_contact);

        // 减少通讯录的大小
        address_book->size--;
    }
}

// 修改联系人信息
void modify_contact(address_book *address_book, char *name, char *new_phone_number, char *new_email_address) {
    // 查找要修改的联系人
    contact *current_contact = address_book->head;
    while (current_contact != NULL && strcmp(current_contact->name, name) != 0) {
        current_contact = current_contact->next;
    }

    // 如果找到了要修改的联系人,则修改其信息
    if (current_contact != NULL) {
        current_contact->phone_number = new_phone_number;
        current_contact->email_address = new_email_address;
    }
}

// 查找联系人
contact *find_contact(address_book *address_book, char *name) {
    // 查找要查找的联系人
    contact *current_contact = address_book->head;
    while (current_contact != NULL && strcmp(current_contact->name, name) != 0) {
        current_contact = current_contact->next;
    }

    // 返回要查找的联系人
    return current_contact;
}

// 显示所有联系人
void print_address_book(address_book *address_book) {
    // 遍历通讯录并打印每个联系人的信息
    contact *current_contact = address_book->head;
    while (current_contact != NULL) {
        printf("%s %s %s\n", current_contact->name, current_contact->phone_number, current_contact->email_address);
        current_contact = current_contact->next;
    }
}

// 释放通讯录的内存
void free_address_book(address_book *address_book) {
    // 释放每个联系人的内存
    contact *current_contact = address_book->head;
    while (current_contact != NULL) {
        contact *next_contact = current_contact->next;
        free(current_contact);
        current_contact = next_contact;
    }

    // 释放通讯录的内存
    free(address_book);
}

// 主函数
int main() {
    // 创建通讯录
    address_book *address_book = create_address_book();

    // 添加联系人
    add_contact(address_book, "John Doe", "555-123-4567", "john.doe@example.com");
    add_contact(address_book, "Jane Smith", "555-234-5678", "jane.smith@example.com");
    add_contact(address_book, "Michael Jones", "555-345-6789", "michael.jones@example.com");

    // 打印通讯录
    print_address_book(address_book);

    // 查找联系人
    contact *contact = find_contact(address_book, "Jane Smith");
    if (contact != NULL) {
        printf("Found contact: %s %s %s\n", contact->name, contact->phone_number, contact->email_address);
    } else {
        printf("Contact not found.\n");
    }

    // 修改联系人信息
    modify_contact(address_book, "Michael Jones", "555-456-7890", "michael.jones@new_email.com");

    // 删除联系人
    delete_contact(address_book, "John Doe");

    // 再次打印通讯录
    print_address_book(address_book);

    // 释放通讯录的内存
    free_address_book(address_book);

    return 0;
}

运行结果

John Doe 555-123-4567 john.doe@example.com
Jane Smith 555-234-5678 jane.smith@example.com
Michael Jones 555-345-6789 michael.jones@example.com
Found contact: Jane Smith 555-234-5678 jane.smith@example.com
John Doe 555-123-4567 john.doe@example.com
Jane Smith 555-234-5678 jane.smith@example.com
Michael Jones 555-456-7890 michael.jones