前言
本篇博客主要介绍三个版本通讯录的实现。通讯录具有增删查改的功能,以及自己增加的另外的一些功能。
静态通讯录
一开始,静态通讯录开辟了能够存储一千个联系人的信息的数组。这样会导致几个问题:要么是数组开辟的空间过大,造成内存浪费;要么就是数组开辟的空间过小,无妨存储过多的联系人。所以静态通讯录就不够灵活。在静态通讯录的基础上,就引入了动态通讯录。
动态通讯录
动态通讯录的初始容量为三个联系人,当容量不够时,动态通讯录会自动增容,每次增加两个联系人的空间。相对于静态通讯录,动态通讯录显得更加灵活。
文件通讯录
不管是静态通讯录,还是动态通讯录,都有着一个缺点。那就是在程序结束的时候,我们所输入的数据都无妨保存下来。而文件通讯录能够很好地解决这个问题,文件通讯录能将我们所输入的数据都保存在一个文件中。当程序运行时,文件中的数据会加载到通讯录中。
博客须知
因为通讯录的代码量较大,只写在一个文件的话会影响我们的阅读,所以本博客的通讯录分三个模块来实现。
contact.h
主要负责结构体声明、头文件引用、宏定义和函数声明等
contact.c
负责实现头文件contact.h中的函数
test.c
负责实现通讯录的增删查改的功能等
静态通讯录
contact.h
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <stdlib.h> #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等。
contact.c
#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主要负责函数的实现,以及对通讯录进行初始化。
test.c
#define _CRT_SECURE_NO_WARNINGS 1 //#include <stdio.h> //通讯录 //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函数将动态开辟的内存释放掉。
contact.h
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <stdlib.h> #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);
contact.c
#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"); }
test.c
#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; }
文件通讯录
在动态通讯录的基础上,文件通讯录能将我们输入的数据保存在一个文件中,从而不会在出现程序结束,数据就会消失的情况了。
contact.h
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <stdlib.h> #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);
contact.c
#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"); }
test.c
#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; }
以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个赞支持一下!