怎么用C语言实现通讯录功能

发布时间:2022-09-23 09:53:03 作者:iii
来源:亿速云 阅读:145

怎么用C语言实现通讯录功能

目录

  1. 引言
  2. 需求分析
  3. 数据结构设计
  4. 功能模块设计
  5. 代码实现
  6. 完整代码
  7. 总结

引言

通讯录是我们日常生活中常用的工具之一,它可以帮助我们存储和管理联系人信息。在本文中,我们将使用C语言来实现一个简单的通讯录功能。通过这个项目,你将学习如何使用C语言进行文件操作、数据结构设计以及模块化编程。

需求分析

在开始编写代码之前,我们需要明确通讯录的基本功能需求:

  1. 添加联系人:用户可以输入联系人的姓名、电话号码、电子邮件等信息,并将其添加到通讯录中。
  2. 删除联系人:用户可以通过姓名或其他唯一标识符删除通讯录中的联系人。
  3. 查找联系人:用户可以通过姓名或其他信息查找通讯录中的联系人。
  4. 修改联系人:用户可以修改通讯录中已有联系人的信息。
  5. 显示所有联系人:用户可以查看通讯录中所有联系人的信息。
  6. 保存通讯录到文件:用户可以将通讯录保存到文件中,以便下次使用。
  7. 从文件加载通讯录:用户可以从文件中加载之前保存的通讯录。

数据结构设计

为了实现上述功能,我们需要设计一个合适的数据结构来存储联系人信息。我们可以使用结构体来表示每个联系人,并使用链表或数组来存储多个联系人。

联系人结构体

typedef struct Contact {
    char name[50];
    char phone[15];
    char email[50];
    struct Contact* next;
} Contact;

在这个结构体中,namephoneemail分别表示联系人的姓名、电话号码和电子邮件地址。next指针用于将多个联系人连接成一个链表。

通讯录结构体

typedef struct AddressBook {
    Contact* head;
    int count;
} AddressBook;

AddressBook结构体包含一个指向链表头部的指针head和一个表示联系人总数的整数count

功能模块设计

接下来,我们将通讯录的功能划分为多个模块,每个模块负责实现一个特定的功能。

  1. 添加联系人模块:负责将新联系人添加到通讯录中。
  2. 删除联系人模块:负责从通讯录中删除指定联系人。
  3. 查找联系人模块:负责根据姓名或其他信息查找联系人。
  4. 修改联系人模块:负责修改通讯录中已有联系人的信息。
  5. 显示所有联系人模块:负责显示通讯录中所有联系人的信息。
  6. 保存通讯录到文件模块:负责将通讯录保存到文件中。
  7. 从文件加载通讯录模块:负责从文件中加载通讯录。

代码实现

5.1 数据结构定义

首先,我们定义联系人和通讯录的结构体。

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

typedef struct Contact {
    char name[50];
    char phone[15];
    char email[50];
    struct Contact* next;
} Contact;

typedef struct AddressBook {
    Contact* head;
    int count;
} AddressBook;

5.2 添加联系人

接下来,我们实现添加联系人的功能。用户输入联系人的姓名、电话号码和电子邮件地址,程序将其添加到通讯录中。

void addContact(AddressBook* book) {
    Contact* newContact = (Contact*)malloc(sizeof(Contact));
    if (newContact == NULL) {
        printf("内存分配失败!\n");
        return;
    }

    printf("请输入姓名: ");
    scanf("%s", newContact->name);
    printf("请输入电话号码: ");
    scanf("%s", newContact->phone);
    printf("请输入电子邮件: ");
    scanf("%s", newContact->email);

    newContact->next = book->head;
    book->head = newContact;
    book->count++;

    printf("联系人添加成功!\n");
}

5.3 删除联系人

删除联系人的功能需要用户输入要删除的联系人姓名,程序遍历链表找到该联系人并将其删除。

void deleteContact(AddressBook* book, char* name) {
    Contact* current = book->head;
    Contact* previous = NULL;

    while (current != NULL) {
        if (strcmp(current->name, name) == 0) {
            if (previous == NULL) {
                book->head = current->next;
            } else {
                previous->next = current->next;
            }
            free(current);
            book->count--;
            printf("联系人删除成功!\n");
            return;
        }
        previous = current;
        current = current->next;
    }

    printf("未找到该联系人!\n");
}

5.4 查找联系人

查找联系人的功能允许用户通过姓名查找联系人信息。

void findContact(AddressBook* book, char* name) {
    Contact* current = book->head;

    while (current != NULL) {
        if (strcmp(current->name, name) == 0) {
            printf("姓名: %s\n", current->name);
            printf("电话号码: %s\n", current->phone);
            printf("电子邮件: %s\n", current->email);
            return;
        }
        current = current->next;
    }

    printf("未找到该联系人!\n");
}

5.5 修改联系人

修改联系人的功能允许用户通过姓名查找联系人并修改其信息。

void modifyContact(AddressBook* book, char* name) {
    Contact* current = book->head;

    while (current != NULL) {
        if (strcmp(current->name, name) == 0) {
            printf("请输入新的电话号码: ");
            scanf("%s", current->phone);
            printf("请输入新的电子邮件: ");
            scanf("%s", current->email);
            printf("联系人信息修改成功!\n");
            return;
        }
        current = current->next;
    }

    printf("未找到该联系人!\n");
}

5.6 显示所有联系人

显示所有联系人的功能将遍历链表并打印每个联系人的信息。

void displayContacts(AddressBook* book) {
    Contact* current = book->head;

    if (current == NULL) {
        printf("通讯录为空!\n");
        return;
    }

    while (current != NULL) {
        printf("姓名: %s\n", current->name);
        printf("电话号码: %s\n", current->phone);
        printf("电子邮件: %s\n", current->email);
        printf("----------------------------\n");
        current = current->next;
    }
}

5.7 保存通讯录到文件

保存通讯录到文件的功能将通讯录中的联系人信息写入到一个文件中。

void saveToFile(AddressBook* book, char* filename) {
    FILE* file = fopen(filename, "w");
    if (file == NULL) {
        printf("文件打开失败!\n");
        return;
    }

    Contact* current = book->head;
    while (current != NULL) {
        fprintf(file, "%s,%s,%s\n", current->name, current->phone, current->email);
        current = current->next;
    }

    fclose(file);
    printf("通讯录已保存到文件!\n");
}

5.8 从文件加载通讯录

从文件加载通讯录的功能将从文件中读取联系人信息并重新构建通讯录。

void loadFromFile(AddressBook* book, char* filename) {
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        printf("文件打开失败!\n");
        return;
    }

    char name[50], phone[15], email[50];
    while (fscanf(file, "%[^,],%[^,],%[^\n]\n", name, phone, email) != EOF) {
        Contact* newContact = (Contact*)malloc(sizeof(Contact));
        if (newContact == NULL) {
            printf("内存分配失败!\n");
            return;
        }

        strcpy(newContact->name, name);
        strcpy(newContact->phone, phone);
        strcpy(newContact->email, email);
        newContact->next = book->head;
        book->head = newContact;
        book->count++;
    }

    fclose(file);
    printf("通讯录已从文件加载!\n");
}

完整代码

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

typedef struct Contact {
    char name[50];
    char phone[15];
    char email[50];
    struct Contact* next;
} Contact;

typedef struct AddressBook {
    Contact* head;
    int count;
} AddressBook;

void addContact(AddressBook* book) {
    Contact* newContact = (Contact*)malloc(sizeof(Contact));
    if (newContact == NULL) {
        printf("内存分配失败!\n");
        return;
    }

    printf("请输入姓名: ");
    scanf("%s", newContact->name);
    printf("请输入电话号码: ");
    scanf("%s", newContact->phone);
    printf("请输入电子邮件: ");
    scanf("%s", newContact->email);

    newContact->next = book->head;
    book->head = newContact;
    book->count++;

    printf("联系人添加成功!\n");
}

void deleteContact(AddressBook* book, char* name) {
    Contact* current = book->head;
    Contact* previous = NULL;

    while (current != NULL) {
        if (strcmp(current->name, name) == 0) {
            if (previous == NULL) {
                book->head = current->next;
            } else {
                previous->next = current->next;
            }
            free(current);
            book->count--;
            printf("联系人删除成功!\n");
            return;
        }
        previous = current;
        current = current->next;
    }

    printf("未找到该联系人!\n");
}

void findContact(AddressBook* book, char* name) {
    Contact* current = book->head;

    while (current != NULL) {
        if (strcmp(current->name, name) == 0) {
            printf("姓名: %s\n", current->name);
            printf("电话号码: %s\n", current->phone);
            printf("电子邮件: %s\n", current->email);
            return;
        }
        current = current->next;
    }

    printf("未找到该联系人!\n");
}

void modifyContact(AddressBook* book, char* name) {
    Contact* current = book->head;

    while (current != NULL) {
        if (strcmp(current->name, name) == 0) {
            printf("请输入新的电话号码: ");
            scanf("%s", current->phone);
            printf("请输入新的电子邮件: ");
            scanf("%s", current->email);
            printf("联系人信息修改成功!\n");
            return;
        }
        current = current->next;
    }

    printf("未找到该联系人!\n");
}

void displayContacts(AddressBook* book) {
    Contact* current = book->head;

    if (current == NULL) {
        printf("通讯录为空!\n");
        return;
    }

    while (current != NULL) {
        printf("姓名: %s\n", current->name);
        printf("电话号码: %s\n", current->phone);
        printf("电子邮件: %s\n", current->email);
        printf("----------------------------\n");
        current = current->next;
    }
}

void saveToFile(AddressBook* book, char* filename) {
    FILE* file = fopen(filename, "w");
    if (file == NULL) {
        printf("文件打开失败!\n");
        return;
    }

    Contact* current = book->head;
    while (current != NULL) {
        fprintf(file, "%s,%s,%s\n", current->name, current->phone, current->email);
        current = current->next;
    }

    fclose(file);
    printf("通讯录已保存到文件!\n");
}

void loadFromFile(AddressBook* book, char* filename) {
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        printf("文件打开失败!\n");
        return;
    }

    char name[50], phone[15], email[50];
    while (fscanf(file, "%[^,],%[^,],%[^\n]\n", name, phone, email) != EOF) {
        Contact* newContact = (Contact*)malloc(sizeof(Contact));
        if (newContact == NULL) {
            printf("内存分配失败!\n");
            return;
        }

        strcpy(newContact->name, name);
        strcpy(newContact->phone, phone);
        strcpy(newContact->email, email);
        newContact->next = book->head;
        book->head = newContact;
        book->count++;
    }

    fclose(file);
    printf("通讯录已从文件加载!\n");
}

int main() {
    AddressBook book = {NULL, 0};
    int choice;
    char name[50];
    char filename[50];

    while (1) {
        printf("\n通讯录管理系统\n");
        printf("1. 添加联系人\n");
        printf("2. 删除联系人\n");
        printf("3. 查找联系人\n");
        printf("4. 修改联系人\n");
        printf("5. 显示所有联系人\n");
        printf("6. 保存通讯录到文件\n");
        printf("7. 从文件加载通讯录\n");
        printf("8. 退出\n");
        printf("请选择操作: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                addContact(&book);
                break;
            case 2:
                printf("请输入要删除的联系人姓名: ");
                scanf("%s", name);
                deleteContact(&book, name);
                break;
            case 3:
                printf("请输入要查找的联系人姓名: ");
                scanf("%s", name);
                findContact(&book, name);
                break;
            case 4:
                printf("请输入要修改的联系人姓名: ");
                scanf("%s", name);
                modifyContact(&book, name);
                break;
            case 5:
                displayContacts(&book);
                break;
            case 6:
                printf("请输入要保存的文件名: ");
                scanf("%s", filename);
                saveToFile(&book, filename);
                break;
            case 7:
                printf("请输入要加载的文件名: ");
                scanf("%s", filename);
                loadFromFile(&book, filename);
                break;
            case 8:
                printf("退出程序。\n");
                return 0;
            default:
                printf("无效的选择,请重新输入!\n");
        }
    }

    return 0;
}

总结

通过本文,我们学习了如何使用C语言实现一个简单的通讯录功能。我们设计了合适的数据结构,并实现了添加、删除、查找、修改、显示、保存和加载联系人信息的功能。这个项目不仅帮助我们巩固了C语言的基础知识,还让我们了解了如何进行模块化编程和文件操作。希望这个项目对你有所帮助,并激发你进一步探索C语言的兴趣。

推荐阅读:
  1. 用OC语言完成简易通讯录(实现增删改查)功能.
  2. vue如何实现通讯录功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:如何恢复SQLSERVER的master系统库

下一篇:MYSQL的架构设计是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》