目录
本篇博客主要介绍三个版本通讯录的实现。通讯录具有增删查改的功能,以及自己增加的另外的一些功能。
- 静态通讯录
一开始,静态通讯录开辟了能够存储一千个联系人的信息的数组。这样会导致几个问题:要么是数组开辟的空间过大,造成内存浪费;要么就是数组开辟的空间过小,无妨存储过多的联系人。所以静态通讯录就不够灵活。在静态通讯录的基础上,就引入了动态通讯录。
- 动态通讯录
动态通讯录的初始容量为三个联系人,当容量不够时,动态通讯录会自动增容,每次增加两个联系人的空间。相对于静态通讯录,动态通讯录显得更加灵活。
- 文件通讯录
不管是静态通讯录,还是动态通讯录,都有着一个缺点。那就是在程序结束的时候,我们所输入的数据都无妨保存下来。而文件通讯录能够很好地解决这个问题,文件通讯录能将我们所输入的数据都保存在一个文件中。当程序运行时,文件中的数据会加载到通讯录中。
因为通讯录的代码量较大,只写在一个文件的话会影响我们的阅读,所以本博客的通讯录分三个模块来实现。
- contact.h
主要负责结构体声明、头文件引用、宏定义和函数声明等
- contact.c
负责实现头文件contact.h中的函数
- test.c
负责实现通讯录的增删查改的功能等
- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include
- #include
- #include
-
- #define MAX_NAME 20
- #define MAX_SEX 20
- #define MAX_TELE 12
- #define MAX_ADDR 30
- #define MAX 1000 //联系人的最大容量
- //类型的定义
- typedef struct PeoInfo
- {
- char name[MAX_NAME];
- char sex[MAX_SEX];
- int age;
- char tele[MAX_TELE];
- char addr[MAX_ADDR];
- }PeoInfo;
-
- //通讯录
- typedef struct Contact
- {
- PeoInfo data[MAX];//存放添加进来人的信息
- int sz;//记录的是当前通讯录中有效信息的个数
- }Contact;
-
- //初始化通讯录
- void InitContact(Contact* pc);
-
- //增加联系人信息
- void AddContact(Contact* pc);
-
- //打印联系人信息
- void PrintContact(const Contact* pc);
-
- //删除联系人信息
- void DelContact(Contact* pc);
-
- //查找指定联系人
- void SearchContact(Contact* pc);
-
- //修改指定联系人
- void ModifyContact(Contact* pc);
-
- //按年龄排序
- void SortByAgeContatc(Contact* pc);
分析:头文件contact.h主要负责结构体的声明、函数的声明以及头文件的引用。结构体中包含了联系人的姓名、性别、年龄、电话号码和住址。为了方便修改结构体内的数组的大小,我们借助#define来定义常量,如#define MAX_NAME 20等。
- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include "contact.h"
- void InitContact(Contact* pc)
- {
- //联系人初始化
- pc->sz = 0;
- //memset(); -内存设置
- //pc->data为数组名
- //sizeof(数组名),数组名表示的是整个数组,计算的是整个数组的大小
- //&数组名,数组名表示的是整个数组,取出的是数组的地址
- //除此之外,数组名表示的都是数组首元素的地址
- memset(pc->data, 0, sizeof(pc->data));//将通讯录中的数据都设置为0
- }
-
- void AddContact(Contact* pc)
- {
- if (pc->sz == MAX)
- {
- printf("通讯录已满,无法添加!\n\n");
- return;
- }
- //增加一个人的信息
- printf("请输入名字:>");
- scanf("%s", pc->data[pc->sz].name);
- printf("请输入年龄:>");
- scanf("%d", &(pc->data[pc->sz].age));
- printf("请输入性别:>");
- scanf("%s", pc->data[pc->sz].sex);
- printf("请输入电话:>");
- scanf("%s", pc->data[pc->sz].tele);
- printf("请输入地址:>");
- scanf("%s", pc->data[pc->sz].addr);
-
- pc->sz++;
- printf("联系人信息增加成功\n\n");
-
- }
-
- void PrintContact(const Contact* pc)
- {
- int i = 0;
- //打印标题
- printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
- //打印数据
- if (pc->sz == 0)
- {
- printf("\n");
- }
- for (i = 0; i < pc->sz; i++)
- {
- printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
- pc->data[i].name,
- pc->data[i].age,
- pc->data[i].sex,
- pc->data[i].tele,
- pc->data[i].addr);
- if (i == pc->sz - 1)
- {
- printf("\n");
- }
- }
- }
-
- static int FindByName(Contact* pc, char name[])
- {
- int i = 0;
- for (i = 0; i < pc->sz; i++)
- {
- if (strcmp(pc->data[i].name, name) == 0)
- {
- return i;//找到了
- }
- }
- return -1;//找不到
- }
- void DelContact(Contact* pc)
- {
- char name[MAX_NAME] = { 0 };
- if (pc->sz == 0)
- {
- printf("通讯录为空,无需删除\n\n");
- return;
- }
- printf("请输入要删除联系人的名字:>");
- scanf("%s", name);
- //1.查找要删除的联系人
- //有或没有
- int pos = FindByName(pc, name);
- if (pos == -1)
- {
- printf("要删除的联系人不存在\n\n");
- return;
- }
- //2.删除联系人
- else
- {
- int i = 0;
- for (i = pos; i < pc->sz - 1; i++)
- {
- pc->data[i] = pc->data[i + 1];
- }
- pc->sz--;
- printf("删除成功\n\n");
- }
- }
-
- void SearchContact(Contact* pc)
- {
- char name[MAX_NAME] = { 0 };
- printf("请输入要查找联系人的名字:>");
- scanf("%s", name);
- int pos = FindByName(pc, name);
- if (pos == -1)
- {
- printf("要查找的联系人不存在\n\n");
- return;
- }
- else
- {
- printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
- //打印查找联系人的信息
- printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n\n",
- pc->data[pos].name,
- pc->data[pos].age,
- pc->data[pos].sex,
- pc->data[pos].tele,
- pc->data[pos].addr);
- }
- }
-
- void ModifyContact(Contact* pc)
- {
- char name[MAX_NAME] = { 0 };
- printf("请输入要修改联系人的名字:>");
- scanf("%s", name);
- int pos = FindByName(pc, name);
- if (pos == -1)
- {
- printf("要修改的联系人不存在\n\n");
- return;
- }
- else
- {
- printf("请输入名字:>");
- scanf("%s", pc->data[pos].name);
- printf("请输入年龄:>");
- scanf("%d", &(pc->data[pos].age));
- printf("请输入性别:>");
- scanf("%s", pc->data[pos].sex);
- printf("请输入电话:>");
- scanf("%s", pc->data[pos].tele);
- printf("请输入地址:>");
- scanf("%s", pc->data[pos].addr);
- printf("修改成功\n");
- }
- }
-
- void SortByAgeContatc(Contact* pc)
- {
- int i = 0, j = 0;
- //按照年龄来升序排序
- for (i = 0; i < pc->sz-1; i++)
- {
- for (j = 0; j < pc->sz - 1 - i; j++)
- {
- if (pc->data[j].age > pc->data[j + 1].age)
- {
- PeoInfo temp = pc->data[j];
- pc->data[j] = pc->data[j + 1];
- pc->data[j + 1] = temp;
- }
- }
- }
- printf("排序成功\n\n");
- }
分析:源文件contact.c主要负责函数的实现,以及对通讯录进行初始化。
- #define _CRT_SECURE_NO_WARNINGS 1
-
- //#include
- //通讯录
- //1.通讯录中能存放一千个人的信息
- //每个人的信息:
- //名字+年龄+性别+电话+地址
- //2.增加联系人信息
- //3.删除指定人的信息
- //4.修改指定人的信息
- //5.查找指定人的信息
- //6.排序通讯录的信息
- //test.测试通讯录的模块
- //contact.h放类型定义、函数声明
- //contact.c放函数的实现
-
-
- void menu()
- {
-
- printf("**************************************\n");
- printf("******** 1. add 2. del *******\n");
- printf("******** 3. search 4. modify *******\n");
- printf("******** 5. sort 6 print *******\n");
- printf("**********0. exit *******\n");
- printf("**************************************\n");
- }
- enum Option
- {
- EXIT,
- ADD,
- DEL,
- SEARCH,
- MODIFY,
- SORT,
- PRINT,
- };
-
- #include "contact.h"
-
- int main()
- {
- int input = 0;
- //创建通讯录
- Contact con;//通讯录
- //初始化通讯录
- InitContact(&con);
-
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- switch(input)
- {
- case EXIT:
- printf("退出通讯录\n");
- break;
- case ADD:
- //增加人的信息
- AddContact(&con);
- break;
- case DEL:
- //删除人的信息
- DelContact(&con);
- break;
- case SEARCH:
- SearchContact(&con);
- break;
- case MODIFY:
- ModifyContact(&con);
- break;
- case SORT:
- SortByAgeContatc(&con);
- break;
- case PRINT:
- PrintContact(&con);
- break;
- default:
- printf("输入错误,请重新输入\n");
- break;
- }
- } while (input);
- return 0;
- }
-
分析:源文件test.c主要是借助do-while语句和switch语句来实现我们对功能的选择,同时还利用了枚举的优势,达到见文思意的效果。
以上就是静态通讯录的基本介绍了。
动态通讯录在静态通讯录的基础上,借助动态内存开辟的知识很好地解决了静态通讯录不够灵活的问题。相较于静态通讯录,动态通讯录的结构体多了变量capacity,来实时记录通讯录的最大容量。如果联系人的数量超过了最大容量,通讯录将会自动增容。值得注意的是,动态通讯录使用了动态内存开辟函数,所以在程序结束的时候,我们要利用free函数将动态开辟的内存释放掉。
- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include
- #include
- #include
-
- #define MAX_NAME 20
- #define MAX_SEX 20
- #define MAX_TELE 12
- #define MAX_ADDR 30
- #define MAX 1000
- #define DEFAULT_SZ 3 //初始容量
- #define INC_SZ 2 //增量
- //类型的定义
- typedef struct PeoInfo
- {
- char name[MAX_NAME];
- char sex[MAX_SEX];
- int age;
- char tele[MAX_TELE];
- char addr[MAX_ADDR];
- }PeoInfo;
-
-
- //动态版本
- typedef struct Contact
- {
- PeoInfo* data;//指向动态申请的空间,用来存放联系人的信息
- int sz;//记录的是当前通讯录中有效信息的个数
- int capacity;//记录当前通讯录的最大容量
- }Contact;
-
- //初始化通讯录
- void InitContact(Contact* pc);
-
- //增加联系人信息
- void AddContact(Contact* pc);
-
- //打印联系人信息
- void PrintContact(const Contact* pc);
-
- //删除联系人信息
- void DelContact(Contact* pc);
-
- //查找指定联系人
- void SearchContact(Contact* pc);
-
- //修改指定联系人
- void ModifyContact(Contact* pc);
-
- //按年龄排序
- void SortByAgeContatc(Contact* pc);
-
- void DestoryContact(Contact* pc);
- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include "contact.h"
-
- //动态版本初始化
- void InitContact(Contact* pc)
- {
- pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
- if (pc->data == NULL)
- {
- perror("InitContact");
- return;
- }
- pc->sz = 0;//初始化后默认为0
- pc->capacity = DEFAULT_SZ;
- }
-
-
- //动态版本的增加联系人
- void AddContact(Contact* pc)
- {
- //考虑增容
- if (pc->sz == pc->capacity)
- {
- PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
- if (ptr != NULL)
- {
- pc->data = ptr;
- pc->capacity += INC_SZ;
- printf("增容成功\n");
- }
- else
- {
- perror("AddContact");
- printf("增加联系人失败\n");
- return;
- }
- }
- //增加一个人的信息
- printf("请输入名字:>");
- scanf("%s", pc->data[pc->sz].name);
- printf("请输入年龄:>");
- scanf("%d", &(pc->data[pc->sz].age));
- printf("请输入性别:>");
- scanf("%s", pc->data[pc->sz].sex);
- printf("请输入电话:>");
- scanf("%s", pc->data[pc->sz].tele);
- printf("请输入地址:>");
- scanf("%s", pc->data[pc->sz].addr);
-
- pc->sz++;
- printf("联系人信息增加成功\n\n");
-
- }
-
- //销毁通讯录
- void DestoryContact(Contact* pc)
- {
- free(pc->data);
- pc->data = NULL;
- pc->sz = 0;
- pc->capacity = 0;
- }
-
- void PrintContact(const Contact* pc)
- {
- int i = 0;
- //打印标题
- printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
- //打印数据
- if (pc->sz == 0)
- {
- printf("\n");
- }
- for (i = 0; i < pc->sz; i++)
- {
- printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
- pc->data[i].name,
- pc->data[i].age,
- pc->data[i].sex,
- pc->data[i].tele,
- pc->data[i].addr);
- if (i == pc->sz - 1)
- {
- printf("\n");
- }
- }
- }
-
- static int FindByName(Contact* pc, char name[])
- {
- int i = 0;
- for (i = 0; i < pc->sz; i++)
- {
- if (strcmp(pc->data[i].name, name) == 0)
- {
- return i;//找到了
- }
- }
- return -1;//找不到
- }
- void DelContact(Contact* pc)
- {
- char name[MAX_NAME] = { 0 };
- if (pc->sz == 0)
- {
- printf("通讯录为空,无需删除\n\n");
- return;
- }
- printf("请输入要删除联系人的名字:>");
- scanf("%s", name);
- //1.查找要删除的联系人
- //有或没有
- int pos = FindByName(pc, name);
- if (pos == -1)
- {
- printf("要删除的联系人不存在\n\n");
- return;
- }
- //2.删除联系人
- else
- {
- int i = 0;
- for (i = pos; i < pc->sz - 1; i++)
- {
- pc->data[i] = pc->data[i + 1];
- }
- pc->sz--;
- printf("删除成功\n\n");
- }
- }
-
- void SearchContact(Contact* pc)
- {
- char name[MAX_NAME] = { 0 };
- printf("请输入要查找联系人的名字:>");
- scanf("%s", name);
- int pos = FindByName(pc, name);
- if (pos == -1)
- {
- printf("要查找的联系人不存在\n\n");
- return;
- }
- else
- {
- printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
- //打印查找联系人的信息
- printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n\n",
- pc->data[pos].name,
- pc->data[pos].age,
- pc->data[pos].sex,
- pc->data[pos].tele,
- pc->data[pos].addr);
- }
- }
-
- void ModifyContact(Contact* pc)
- {
- char name[MAX_NAME] = { 0 };
- printf("请输入要修改联系人的名字:>");
- scanf("%s", name);
- int pos = FindByName(pc, name);
- if (pos == -1)
- {
- printf("要修改的联系人不存在\n\n");
- return;
- }
- else
- {
- printf("请输入名字:>");
- scanf("%s", pc->data[pos].name);
- printf("请输入年龄:>");
- scanf("%d", &(pc->data[pos].age));
- printf("请输入性别:>");
- scanf("%s", pc->data[pos].sex);
- printf("请输入电话:>");
- scanf("%s", pc->data[pos].tele);
- printf("请输入地址:>");
- scanf("%s", pc->data[pos].addr);
- printf("修改成功\n");
- }
- }
-
- void SortByAgeContatc(Contact* pc)
- {
- int i = 0, j = 0;
- //按照年龄来升序排序
- for (i = 0; i < pc->sz - 1; i++)
- {
- for (j = 0; j < pc->sz - 1 - i; j++)
- {
- if (pc->data[j].age > pc->data[j + 1].age)
- {
- PeoInfo temp = pc->data[j];
- pc->data[j] = pc->data[j + 1];
- pc->data[j + 1] = temp;
- }
- }
- }
- printf("排序成功\n\n");
- }
-
- #define _CRT_SECURE_NO_WARNINGS 1
-
- //通讯录--静态版本
- //1.通讯录中能存放一千个人的信息
- //每个人的信息:
- //名字+年龄+性别+电话+地址
- //2.增加联系人信息
- //3.删除指定人的信息
- //4.修改指定人的信息
- //5.查找指定人的信息
- //6.排序通讯录的信息
- //test.测试通讯录的模块
- //contact.h放类型定义、函数声明
- //contact.c放函数的实现
- //
- //版本2:
- //动态增长的版本
- //1.通讯录初始化后,能存放3个人的信息
- //2.当我们空间的存放满的时候,我们增加2个人信息的空间
- //3+2+2+2+2....
- //
-
-
- void menu()
- {
- printf("**************************************\n");
- printf("******** 1. add 2. del *******\n");
- printf("******** 3. search 4. modify *******\n");
- printf("******** 5. sort 6 print *******\n");
- printf("**********0. exit *******\n");
- printf("**************************************\n\n");
- }
- enum Option
- {
- EXIT,
- ADD,
- DEL,
- SEARCH,
- MODIFY,
- SORT,
- PRINT,
- };
-
- #include "contact.h"
-
- int main()
- {
- int input = 0;
- //创建通讯录
- Contact con;//通讯录
- //初始化通讯录
- //给data在堆区上申请一块连续的空间
- //sz=0
- //capacity初始化为当前最大的容量
- InitContact(&con);
-
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- switch (input)
- {
- case EXIT:
- //销毁通讯录
- DestoryContact(&con);
- printf("退出通讯录\n");
- break;
- case ADD:
- //增加人的信息
- AddContact(&con);
- break;
- case DEL:
- //删除人的信息
- DelContact(&con);
- break;
- case SEARCH:
- SearchContact(&con);
- break;
- case MODIFY:
- ModifyContact(&con);
- break;
- case SORT:
- SortByAgeContatc(&con);
- break;
- case PRINT:
- PrintContact(&con);
- break;
- default:
- printf("输入错误,请重新输入\n");
- break;
- }
- } while (input);
- return 0;
- }
-
在动态通讯录的基础上,文件通讯录能将我们输入的数据保存在一个文件中,从而不会在出现程序结束,数据就会消失的情况了。
- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include
- #include
- #include
-
- #define MAX_NAME 20
- #define MAX_SEX 20
- #define MAX_TELE 12
- #define MAX_ADDR 30
- #define MAX 1000
- #define DEFAULT_SZ 3 //初始容量
- #define INC_SZ 2 //增量
- //类型的定义
- typedef struct PeoInfo
- {
- char name[MAX_NAME];
- char sex[MAX_SEX];
- int age;
- char tele[MAX_TELE];
- char addr[MAX_ADDR];
- }PeoInfo;
-
- //通讯录-静态版本
- //typedef struct Contact
- //{
- // PeoInfo data[MAX];//存放添加进来人的信息
- // int sz;//记录的是当前通讯录中有效信息的个数
- //}Contact;
-
- //动态版本
- typedef struct Contact
- {
- PeoInfo* data;//指向动态申请的空间,用来存放联系人的信息
- int sz;//记录的是当前通讯录中有效信息的个数
- int capacity;//记录当前通讯录的最大容量
- }Contact;
-
- //初始化通讯录
- void InitContact(Contact* pc);
-
- //增加联系人信息
- void AddContact(Contact* pc);
-
- //打印联系人信息
- void PrintContact(const Contact* pc);
-
- //删除联系人信息
- void DelContact(Contact* pc);
-
- //查找指定联系人
- void SearchContact(Contact* pc);
-
- //修改指定联系人
- void ModifyContact(Contact* pc);
-
- //按年龄排序
- void SortByAgeContatc(Contact* pc);
-
- //销毁通讯录
- void DestoryContact(Contact* pc);
-
- //保存通讯录信息到文件
- void SaveContact(Contact* pc);
-
- //加载文件内容到通讯录
- void LoadContact(Contact* pc);
-
- //检测是否需要增容
- void CheckCapacity(Contact* pc);
-
- #define _CRT_SECURE_NO_WARNINGS 1
-
-
- #include "contact.h"
-
- //静态版本
- //void InitContact(Contact* pc)
- //{
- // pc->sz = 0;
- // //memset(); -内存设置
- // //pc->data为数组名
- // //sizeof(数组名),数组名表示的是整个数组,计算的是整个数组的大小
- // //&数组名,数组名表示的是整个数组,取出的是数组的地址
- // //除此之外,数组名表示的都是数组首元素的地址
- // memset(pc->data, 0, sizeof(pc->data));//将通讯录中的数据都设置为0
- //}
-
- //加载文件信息到通讯录中
- void LoadContact(Contact* pc)
- {
- FILE* pf = fopen("contact.txt", "r");
- if (pf == NULL)
- {
- perror("LoadContatc");
- return;
- }
- //读文件
- PeoInfo temp = { 0 };
- while (fread(&temp, sizeof(PeoInfo), 1, pf))
- {
- //是否需要增容
- CheckCapacity(pc);
- pc->data[pc->sz] = temp;
- pc->sz++;
- }
- //关闭文件
- fclose(pf);
- pf = NULL;
- }
-
- //动态版本
- void InitContact(Contact* pc)
- {
- pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
- if (pc->data == NULL)
- {
- perror("InitContact");
- return;
- }
- pc->sz = 0;//初始化后默认为0
- pc->capacity = DEFAULT_SZ;
-
- //初始化将文件中的信息加载到通讯录中
- LoadContact(pc);
- }
-
-
-
- void CheckCapacity(Contact* pc)
- {
- if (pc->sz == pc->capacity)
- {
- PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
- if (ptr != NULL)
- {
- pc->data = ptr;
- pc->capacity += INC_SZ;
- printf("增容成功\n");
- }
- else
- {
- perror("AddContact");
- printf("增加联系人失败\n");
- return;
- }
- }
- }
- //动态版本的增加联系人
- void AddContact(Contact* pc)
- {
- //考虑增容
- CheckCapacity(pc);
- //增加一个人的信息
- printf("请输入名字:>");
- scanf("%s", pc->data[pc->sz].name);
- printf("请输入年龄:>");
- scanf("%d", &(pc->data[pc->sz].age));
- printf("请输入性别:>");
- scanf("%s", pc->data[pc->sz].sex);
- printf("请输入电话:>");
- scanf("%s", pc->data[pc->sz].tele);
- printf("请输入地址:>");
- scanf("%s", pc->data[pc->sz].addr);
-
- pc->sz++;
- printf("联系人信息增加成功\n\n");
-
- }
-
- //销毁通讯录
- void DestoryContact(Contact* pc)
- {
- free(pc->data);
- pc->data = NULL;
- pc->sz = 0;
- pc->capacity = 0;
- }
-
- void SaveContact(Contact* pc)
- {
- //打开文件
- FILE* pf = fopen("contact.txt", "w");
- if (pf == NULL)
- {
- perror("fopen");
- return;
- }
- //写文件
- int i = 0;
- for (i = 0; i < pc->sz; i++)
- {
- fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
- }
-
- //关闭文件
- fclose(pf);
- pf = NULL;
- }
-
- void PrintContact(const Contact* pc)
- {
- int i = 0;
- //打印标题
- printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
- //打印数据
- if (pc->sz == 0)
- {
- printf("\n");
- }
- for (i = 0; i < pc->sz; i++)
- {
- printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
- pc->data[i].name,
- pc->data[i].age,
- pc->data[i].sex,
- pc->data[i].tele,
- pc->data[i].addr);
- if (i == pc->sz - 1)
- {
- printf("\n");
- }
- }
- }
-
- static int FindByName(Contact* pc, char name[])
- {
- int i = 0;
- for (i = 0; i < pc->sz; i++)
- {
- if (strcmp(pc->data[i].name, name) == 0)
- {
- return i;//找到了
- }
- }
- return -1;//找不到
- }
- void DelContact(Contact* pc)
- {
- char name[MAX_NAME] = { 0 };
- if (pc->sz == 0)
- {
- printf("通讯录为空,无需删除\n\n");
- return;
- }
- printf("请输入要删除联系人的名字:>");
- scanf("%s", name);
- //1.查找要删除的联系人
- //有或没有
- int pos = FindByName(pc, name);
- if (pos == -1)
- {
- printf("要删除的联系人不存在\n\n");
- return;
- }
- //2.删除联系人
- else
- {
- int i = 0;
- for (i = pos; i < pc->sz - 1; i++)
- {
- pc->data[i] = pc->data[i + 1];
- }
- pc->sz--;
- printf("删除成功\n\n");
- }
- }
-
- void SearchContact(Contact* pc)
- {
- char name[MAX_NAME] = { 0 };
- printf("请输入要查找联系人的名字:>");
- scanf("%s", name);
- int pos = FindByName(pc, name);
- if (pos == -1)
- {
- printf("要查找的联系人不存在\n\n");
- return;
- }
- else
- {
- printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
- //打印查找联系人的信息
- printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n\n",
- pc->data[pos].name,
- pc->data[pos].age,
- pc->data[pos].sex,
- pc->data[pos].tele,
- pc->data[pos].addr);
- }
- }
-
- void ModifyContact(Contact* pc)
- {
- char name[MAX_NAME] = { 0 };
- printf("请输入要修改联系人的名字:>");
- scanf("%s", name);
- int pos = FindByName(pc, name);
- if (pos == -1)
- {
- printf("要修改的联系人不存在\n\n");
- return;
- }
- else
- {
- printf("请输入名字:>");
- scanf("%s", pc->data[pos].name);
- printf("请输入年龄:>");
- scanf("%d", &(pc->data[pos].age));
- printf("请输入性别:>");
- scanf("%s", pc->data[pos].sex);
- printf("请输入电话:>");
- scanf("%s", pc->data[pos].tele);
- printf("请输入地址:>");
- scanf("%s", pc->data[pos].addr);
- printf("修改成功\n");
- }
- }
-
- void SortByAgeContatc(Contact* pc)
- {
- int i = 0, j = 0;
- //按照年龄来升序排序
- for (i = 0; i < pc->sz - 1; i++)
- {
- for (j = 0; j < pc->sz - 1 - i; j++)
- {
- if (pc->data[j].age > pc->data[j + 1].age)
- {
- PeoInfo temp = pc->data[j];
- pc->data[j] = pc->data[j + 1];
- pc->data[j + 1] = temp;
- }
- }
- }
- printf("排序成功\n\n");
- }
-
- #define _CRT_SECURE_NO_WARNINGS 1
-
-
- //通讯录--静态版本
- //1.通讯录中能存放一千个人的信息
- //每个人的信息:
- //名字+年龄+性别+电话+地址
- //2.增加联系人信息
- //3.删除指定人的信息
- //4.修改指定人的信息
- //5.查找指定人的信息
- //6.排序通讯录的信息
- //test.测试通讯录的模块
- //contact.h放类型定义、函数声明
- //contact.c放函数的实现
- //
- //版本2:
- //动态增长的版本
- //1.通讯录初始化后,能存放3个人的信息
- //2.当我们空间的存放满的时候,我们增加2个人信息的空间
- //3+2+2+2+2....
- //
-
- //版本3
- //当通讯录退出的时候,把信息写到文件
- //当通讯录初始化的时候,加载文件的信息到通讯录中
-
-
- void menu()
- {
- printf("**************************************\n");
- printf("******** 1. add 2. del *******\n");
- printf("******** 3. search 4. modify *******\n");
- printf("******** 5. sort 6 print *******\n");
- printf("**********0. exit *******\n");
- printf("**************************************\n\n");
- }
- enum Option
- {
- EXIT,
- ADD,
- DEL,
- SEARCH,
- MODIFY,
- SORT,
- PRINT,
- };
-
- #include "contact.h"
-
- int main()
- {
- int input = 0;
- //创建通讯录
- Contact con;//通讯录
- //初始化通讯录
- //给data在堆区上申请一块连续的空间
- //sz=0
- //capacity初始化为当前最大的容量
- InitContact(&con);
-
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- switch (input)
- {
- case EXIT:
- //保存信息到文件
- SaveContact(&con);
- //销毁通讯录
- DestoryContact(&con);
- printf("退出通讯录\n");
- break;
- case ADD:
- //增加人的信息
- AddContact(&con);
- break;
- case DEL:
- //删除人的信息
- DelContact(&con);
- break;
- case SEARCH:
- SearchContact(&con);
- break;
- case MODIFY:
- ModifyContact(&con);
- break;
- case SORT:
- SortByAgeContatc(&con);
- break;
- case PRINT:
- PrintContact(&con);
- break;
- default:
- printf("输入错误,请重新输入\n");
- break;
- }
- } while (input);
- return 0;
- }
-
以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个赞支持一下!