> 文档中心 > 【C语言】制作一个通讯录管理系统

【C语言】制作一个通讯录管理系统


大家好呀!👋这个是付青云同学的博客,是一名大一在校生哦!😁😁
目前一直在学习C语言。🐸
写博客是为了来记录我的学习过程,同时也希望通过博客能够帮助到需要帮助的人
如果我的博客可以帮助到你,不妨给我一个关注哦😁

前言😁

最近学了深入学习了一下C语言中的结构体和动态内存分配,知道了结构体可以将不同类型的成员封装起来,做成我想要的数据类型;通过不同的动态内存开辟的函数,可以将空间有效的利用。

有了这些知识的铺垫,我想我就就可以尝试做一个通讯录

文章目录

  • 前言😁
  • 思路🤔
  • 📕通讯录📕
    • phonebook.h部分
      • 定义结构体
      • 动态内存
      • 函数的声明
      • 所有的phonebook.h
    • test.c部分
      • 菜单部分
      • 通讯录的创建和初始化
      • 所有的test.c
    • phonebook.c部分
      • 初始化通讯录的函数
      • 添加成员的函数
      • 打印信息的函数
      • 通过名字查找联系人的函数
        • 删除信息的函数
        • 修改信息的函数
      • 查找信息的函数
      • 排序信息
        • 通过姓名和年龄排序
      • 所有的phonebook.c
  • 动画演示
  • 结语

思路🤔

通讯录的功能大家应该都知道吧,这次我们就要用C语言实现一个通讯录的基本功能:

  • 储存人的信息

其中每个人的信息包括:
名字 性别 年龄 地址 电话号码

  • 增加人的信息
  • 删除指定人的信息
  • 修改指定人的信息
  • 查找指定人的信息
  • 排序通讯录的信息

关于内存存放:

  • 通讯录初始化后,能存放3个人的信息
  • 当空间的存放满的时候,增加2个信息

那,废话不多说,我们开始制作吧!

📕通讯录📕

这次为了方便起见,我们建立
phonebook.c(负责函数实现)
test.c(负责函数逻辑)
phonebook.h(负责放置头文件、定义宏、函数声明和定义结构体等)
三个文件

phonebook.h部分

定义结构体

每个人的信息:名字 性别 年龄 地址 电话号码
在这里将这个类型用typedef改为phonebook方便引用

typedef struct phonebook{char name[MAX_NAME];char sex[MAX_SXE];int age;char tele[MAX_TELE];char add[MAX_ADD];}phonebook;

动态内存

将存放人的信息与记录有效信息的个数封装在一起
同样,在这里将这个类型用typedef改为PhoneBook方便引用

typedef struct PhoneBook{phonebook *data;//指向动态申请的空间,用来存放联系人的信息int num;//记录当前通讯录中有效信息的个数int capacity;//记录当前通讯录的最大容量}PhoneBook;

函数的声明

//初始化通讯录void InitPhonebook(PhoneBook *pc);//添加信息void AddPhonebook(PhoneBook* pc);//打印信息void PrintPhonebook(const PhoneBook *pc);//删除信息void DelPhonebook(PhoneBook* pc);//修改信息void RevPhonebook(PhoneBook* pc);//查找信息void SearchPhonebook(const PhoneBook* pc);//将信息排序void SortPhonebook(PhoneBook* pc);//销毁通讯录void DestoryPhonebook(PhoneBook* pc);

所有的phonebook.h

#include #include #include #define MAX_NAME 20#define MAX_SXE 5#define MAX_TELE 12#define MAX_ADD 30#define MAX_PHONEBOOK 1000#define DEFAULT_SZ 3#define INC_SZ 2typedef struct phonebook{char name[MAX_NAME];char sex[MAX_SXE];int age;char tele[MAX_TELE];char add[MAX_ADD];}phonebook;enum E{退出,添加,删除,修改,查找,排序,查看};//动态版本typedef struct PhoneBook{phonebook *data;//指向动态申请的空间,用来存放联系人的信息int num;//记录当前通讯录中有效信息的个数int capacity;//记录当前通讯录的最大容量}PhoneBook;//初始化通讯录void InitPhonebook(PhoneBook *pc);//添加信息void AddPhonebook(PhoneBook* pc);//打印信息void PrintPhonebook(const PhoneBook *pc);//删除信息void DelPhonebook(PhoneBook* pc);//修改信息void RevPhonebook(PhoneBook* pc);//查找信息void SearchPhonebook(const PhoneBook* pc);//将信息排序void SortPhonebook(PhoneBook* pc);//销毁通讯录void DestoryPhonebook(PhoneBook* pc);

test.c部分

在这里,我们在phonebook.h文件中定义了一个枚举变量,将0~6设置为了对应的常量,方便查找,如下:

enum E{退出,添加,删除,修改,查找,排序,查看};

菜单部分

void menu(){printf("***********************************************\n");printf("**********  1、添加    2、删除  ***************\n");printf("**********  3、修改    4、查找  ***************\n");printf("**********  5、排序    6、查看  ***************\n");printf("**************** 0、退出 **********************\n");}int main(){int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 退出:printf("已退出\n");break;case 添加:break;case 删除:break;case 修改:break;case 查找:break;case 排序:break;case 查看:break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;}

通讯录的创建和初始化

//创建通讯录PhoneBook PB;//通讯录//初始化通讯录//给data申请一块连续的空间在堆上//num=0//capacity 初始化为当前的最大的容量InitPhonebook(&PB);//初始化通讯录函数

所有的test.c

#define _CRT_SECURE_NO_WARNINGS#include "phonebook.h"void menu(){printf("***********************************************\n");printf("**********  1、添加    2、删除  ***************\n");printf("**********  3、修改    4、查找  ***************\n");printf("**********  5、排序    6、查看  ***************\n");printf("**************** 0、退出 **********************\n");}int main(){int input = 0;//创建通讯录PhoneBook PB;//通讯录//初始化通讯录//给data申请一块连续的空间在堆上//num=0//capacity 初始化为当前的最大的容量InitPhonebook(&PB);do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 退出://销毁通讯录DestoryPhonebook(&PB);printf("已退出\n");break;case 添加:AddPhonebook(&PB);break;case 删除:DelPhonebook(&PB);break;case 修改:RevPhonebook(&PB);break;case 查找:SearchPhonebook(&PB);break;case 排序:SortPhonebook(&PB);break;case 查看:PrintPhonebook(&PB);break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;}

phonebook.c部分

初始化通讯录的函数

void InitPhonebook(PhoneBook* pc){pc->data = (phonebook*)malloc(DEFAULT_SZ * sizeof(phonebook));if (pc->data == NULL){perror("InitPhonebook");return;}pc->num = 0;pc->capacity = DEFAULT_SZ;}

添加成员的函数

void AddPhonebook(PhoneBook* pc){if (pc->num == pc->capacity){phonebook* ptr = (phonebook*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(phonebook));if (ptr != NULL){pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功!\n");}else{perror("AddPhonebook");printf("增容失败\n");return;}}//添加一个人的信息printf("请输入添加的信息\n");printf("姓名\n");scanf("%s", pc->data[pc->num].name);printf("性别\n");scanf("%s", pc->data[pc->num].sex);printf("年龄\n");scanf("%d", &(pc->data[pc->num].age));printf("电话号码\n");scanf("%s", pc->data[pc->num].tele);printf("地址\n");scanf("%s", pc->data[pc->num].add);pc->num++;printf("增加成功!\n");}

打印信息的函数

void PrintPhonebook(const PhoneBook* pc){int i = 0;//表头printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话号码", "地址");for (i = 0; i < pc->num; i++){printf("%-20s\t%-5s\t%-5d\t%-12s\t%-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].add);}}

通过名字查找联系人的函数

这个函数可以在删除信息,修改信息的函数中使用
利用返回值返回查找信息

int FindByName(const PhoneBook* pc,char name[]){for (int i = 0; i < pc->num; i++){if (strcmp(name, pc->data[i].name) == 0){return i;}}return -1;}

删除信息的函数

void DelPhonebook(PhoneBook* pc){if (pc->num == 0){printf("通讯录为空,无需删除\n");return;}printf("请选择要删除的人的名字:>\n");char name[MAX_NAME] = { 0 };scanf("%s", &name);//查找有没有要删除的人int n = FindByName(pc, name);if (n == -1){printf("要删除的人不存在\n");return;}else{//删除int i = 0;for (i = n; i < pc->num - 1; i++){pc->data[i] = pc->data[i + 1];}pc->num--;printf("删除成功\n");}}

修改信息的函数

void RevPhonebook(PhoneBook* pc){char name[MAX_NAME] = { 0 };printf("请输入要修改的人的姓名\n");scanf("%s", &name);int i = FindByName(pc, name);if (i == -1){printf("要修改的人不存在\n");return;}else{printf("请输入修改的信息\n");printf("姓名\n");scanf("%s", pc->data[i].name);printf("性别\n");scanf("%s", pc->data[i].sex);printf("年龄\n");scanf("%d", &(pc->data[i].age));printf("电话号码\n");scanf("%s", pc->data[i].tele);printf("地址\n");scanf("%s", pc->data[i].add);printf("修改成功!\n");}}

查找信息的函数

void SearchPhonebook(const PhoneBook* pc){char name[MAX_NAME] = { 0 };printf("请输入要查找的人的姓名\n");scanf("%s", &name);int n = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话号码", "地址");for (int i = 0; i < pc->num; i++){if (strcmp(name, pc->data[i].name) == 0){printf("%-20s\t%-5s\t%-5d\t%-12s\t%-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].add);n++;}}if (n==0){printf("要查找的人不存在\n");return;}}

排序信息

在这里我们使用qsort函数来排序

通过姓名和年龄排序

int CmpByName(const void* e1, const void* e2){return *(char*)e1 - *(char*)e2;}int CmpByAge(const void* e1, const void* e2){return *(int*)e1 - *(int*)e2;}void SortPhonebook(PhoneBook* pc){int n = 0;printf("请选择排序方式(1、姓名 0、年龄):>");scanf("%d", &n);if (n){//以姓名排序qsort(pc->data, pc->num, sizeof(pc->data[0]), CmpByName);printf("排序成功!\n");}else{//以年龄排序qsort(pc->data, pc->num, sizeof(pc->data[0]), CmpByAge);printf("排序成功!\n");}}

所有的phonebook.c

#define _CRT_SECURE_NO_WARNINGS#include "phonebook.h"//初始化通讯录 - 静态版本//void InitPhonebook(PhoneBook* pc)//{//pc->num = 0;//memset(pc->data, 0, sizeof(pc->data));//内存设置//}//初始化通讯录 - 动态版本void InitPhonebook(PhoneBook* pc){pc->data = (phonebook*)malloc(DEFAULT_SZ * sizeof(phonebook));if (pc->data == NULL){perror("InitPhonebook");return;}pc->num = 0;pc->capacity = DEFAULT_SZ;}//添加成员 - 静态版本//void AddPhonebook(PhoneBook* pc)//{//if (pc->num == MAX_PHONEBOOK)//{//printf("通讯录已满,无法添加\n");//return;//}////添加一个人的信息//printf("请输入添加的信息\n");//printf("姓名\n");//scanf("%s", pc->data[pc->num].name);//printf("性别\n");//scanf("%s", pc->data[pc->num].sex);//printf("年龄\n");//scanf("%d", &(pc->data[pc->num].age));//printf("电话号码\n");//scanf("%s", pc->data[pc->num].tele);//printf("地址\n");//scanf("%s", pc->data[pc->num].add);//pc->num++;//printf("增加成功!\n");//}//添加成员 - 动态版void AddPhonebook(PhoneBook* pc){if (pc->num == pc->capacity){phonebook* ptr = (phonebook*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(phonebook));if (ptr != NULL){pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功!\n");}else{perror("AddPhonebook");printf("增容失败\n");return;}}//添加一个人的信息printf("请输入添加的信息\n");printf("姓名\n");scanf("%s", pc->data[pc->num].name);printf("性别\n");scanf("%s", pc->data[pc->num].sex);printf("年龄\n");scanf("%d", &(pc->data[pc->num].age));printf("电话号码\n");scanf("%s", pc->data[pc->num].tele);printf("地址\n");scanf("%s", pc->data[pc->num].add);pc->num++;printf("增加成功!\n");}void DestoryPhonebook(PhoneBook* pc){free(pc->data);pc->data = NULL;pc->capacity = 0;pc->num = 0;}void PrintPhonebook(const PhoneBook* pc){int i = 0;//表头printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话号码", "地址");for (i = 0; i < pc->num; i++){printf("%-20s\t%-5s\t%-5d\t%-12s\t%-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].add);}}int FindByName(const PhoneBook* pc,char name[]){for (int i = 0; i < pc->num; i++){if (strcmp(name, pc->data[i].name) == 0){return i;}}return -1;}void DelPhonebook(PhoneBook* pc){if (pc->num == 0){printf("通讯录为空,无需删除\n");return;}printf("请选择要删除的人的名字:>\n");char name[MAX_NAME] = { 0 };scanf("%s", &name);//查找有没有要删除的人int n = FindByName(pc, name);if (n == -1){printf("要删除的人不存在\n");return;}else{//删除int i = 0;for (i = n; i < pc->num - 1; i++){pc->data[i] = pc->data[i + 1];}pc->num--;printf("删除成功\n");}}void RevPhonebook(PhoneBook* pc){char name[MAX_NAME] = { 0 };printf("请输入要修改的人的姓名\n");scanf("%s", &name);int i = FindByName(pc, name);if (i == -1){printf("要修改的人不存在\n");return;}else{printf("请输入修改的信息\n");printf("姓名\n");scanf("%s", pc->data[i].name);printf("性别\n");scanf("%s", pc->data[i].sex);printf("年龄\n");scanf("%d", &(pc->data[i].age));printf("电话号码\n");scanf("%s", pc->data[i].tele);printf("地址\n");scanf("%s", pc->data[i].add);printf("修改成功!\n");}}void SearchPhonebook(const PhoneBook* pc){char name[MAX_NAME] = { 0 };printf("请输入要查找的人的姓名\n");scanf("%s", &name);int n = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话号码", "地址");for (int i = 0; i < pc->num; i++){if (strcmp(name, pc->data[i].name) == 0){printf("%-20s\t%-5s\t%-5d\t%-12s\t%-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].add);n++;}}if (n==0){printf("要查找的人不存在\n");return;}}int CmpByName(const void* e1, const void* e2){return *(char*)e1 - *(char*)e2;}int CmpByAge(const void* e1, const void* e2){return *(int*)e1 - *(int*)e2;}void SortPhonebook(PhoneBook* pc){int n = 0;printf("请选择排序方式(1、姓名 0、年龄):>");scanf("%d", &n);if (n){//以姓名排序qsort(pc->data, pc->num, sizeof(pc->data[0]), CmpByName);printf("排序成功!\n");}else{//以年龄排序qsort(pc->data, pc->num, sizeof(pc->data[0]), CmpByAge);printf("排序成功!\n");}}

动画演示

【C语言】制作一个通讯录管理系统

结语

到这里,通讯录管理系统基本就完成啦!

创作不易
你的关注与支持就是我创作的动力
如果这篇文章对你有帮助的话,不妨给个三连哦。
非常感谢!!
😁😁😁

房贷之家