目录
在之前的篇章中讲述了【C语言】进阶——结构体,【C语言】进阶——动态内存,【C语言】进阶——文件操作。
在本篇运用以上知识结合来写一个小项目——通讯录
我会逐步从静态版本优化到动态增加以及最终的文件存储版,循循渐进,详解通讯录的实现
实现思路
通讯录类似一个复杂结构体,包含了很多信息,以个人信息的通讯录而言,需要包含个人名字,年龄,电话,性别以及地址;
而它所具有的基本功能:增(Add)删(Del) 改(modify) 查 (Search);以及我们可以对其一些简单的拓展功能;
这些具体分析为:
- 打印一个菜单,提供用户选择功能;
- 添加联系人信息;
- 删除联系人信息;
- 查询联系人信息;
- 修改联系人信息;
- 显示所有联系人信息;
- 对所有联系人信息进行排序整理;
- 删除所有联系人信息;
- 操作完毕可选择退出。
将整个项目分为三部分 :
test.c ——测试代码模块
contact.c——函数的实现
contact.h——类型的定义,函数声明等
我们需要映入眼帘的菜单选择和提示,可以选择do...while();和switch语句相结合,来打印出整个框架体系;
另外因为switch语句中case 1,case2...这样的数字不好看,我们可以采用枚举变量来定义;
枚举的关键字是enum
在括号内部注意每个成员名后面要加逗号,同时别忘了括号外面的分号
枚举内部的成员被依次赋值为0,1,2
我们假如将female赋值为1,secret就被赋值为2,male赋值为0
枚举的优点:
1.增加代码的可读性和可维护性
2. 和 #define 定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
- void menu()
- {
- printf("<-==============通讯录=============->\n");
- printf("<-==========1.增加联系人===========->\n");
- printf("<-==========2.删除联系人===========->\n");
- printf("<-==========3.查找联系人===========->\n");
- printf("<-==========4.修改联系人===========->\n");
- printf("<-==========5.打印通讯录===========->\n");
- printf("<-==========6.排序通讯录===========->\n");
- printf("<-==========0.退出通讯录===========->\n");
- printf("<-=================================->\n");
- }
- enum Option
- {
- EXIT, //0
- ADD,
- DEL,
- SEARCH,
- MODIFY,
- SHOW,
- SORT
- };
- int main()
- {
- int input = 0;
- do
- {
- //菜单
- menu();
- printf("请输入操作:");
- scanf("%d", &input);
- switch (input)
- {
- case ADD:
- printf("增加联系人\n");
- break;
- case DEL:
- printf("删除联系人\n");
- break;
- case SEARCH:
- printf("查找联系人\n");
- break;
- case MODIFY:
- printf("修改联系人\n");
- break;
- case SHOW:
- printf("打印联系人\n");
- break;
- case SORT:
- printf("排序联系人\n");
- break;
- case EXIT:
- printf("退出通讯录\n");
- break;
- default:
- printf("输入错误,重新输入\n");
- break;
- }
- } while (input);
- return 0;
- }
创建所需的个人信息结构体
利用#define 定义常量,有利于维护;
- #define NAME_MAX 20
- #define SEX_MAX 5
- #define TELE_MAX 12
- #define ADDR_MAX 30
-
- typedef struct Peo //个人信息结构体
- {
- char name[NAME_MAX];
- int age;
- char sex[SEX_MAX];
- char tele[TELE_MAX];
- char addr[ADDR_MAX];
- }Peo;
另外还需要创建一个结构体,来记录Peo的信息,以数组来存放,创建变量,记录个数
- typedef struct Contact
- {
- Peo data[DATA_MAX]; //存放个人信息
- int sz; //记录信息人数
- }Contact;
- //静态-初始化通讯录
- void InitContact(Contact* pc)
- {
- assert(pc);
- pc->sz = 0;
- memset(pc->data, 0, sizeof(pc->data));
- }
memset来初始化,以字节为单位一个字节一个字节的初始化!
增加之前,先判断是否为满,增加成功后,还需要将sz++,记录加入的人数
- //增加联系人
- void AddContact(Contact* pc)
- {
- assert(pc);
- //判断通讯录是否满了
- if (pc->sz == DATA_MAX)
- {
- 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);
- //对sz增加,
- pc->sz++;
- printf("增加成功\n");
- }
增加联系人后,真的在内存中增加与否,并不知道,我们需要打印出来
先判断是否有信息,然后打印标题,增加可读性,再利用for循环,将sz个信息打印出来
-20就代表域宽是20(长度不够20用空格填充),负号代表左对齐,默认是右对齐的!
- //显示所有的联系人
- void ShowContact(const Contact* pc)
- {
- assert(pc);
- //判断通讯录内是否有信息
- if (pc->sz == 0)
- {
- printf("打印失败,通讯录为空\n");
- return;
- }
- //打印
- //打印标题
- printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");
- //打印信息
- int i = 0;
- for (i = 0; i < pc->sz; i++)
- {
- //打印每个人的信息
- printf("%-20s%-5d%-5s%-12s%-30s\n",
- pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
- }
- }

- 先判断通讯录是否有信息,通过名字来查找是否存在此人,
- 封装函数:因为我们在查找联系人,修改联系人中也会用到此功能。查找到此人,返回sz位置,没有此人,返回-1;
- 通过for循环:假如要删除人为 tmp的信息;就只需要把tmp后的数据往前移动,覆盖掉tmp位置的信息就可以了;
- 如果要删除最后一个人,则直接sz--;可以不进行访问,算是删除了
- 删除成功后,就把sz--;说明数组里的有效数据减1!
- //通过名字查找被删除人
- static int FindByName(Contact* pc, char* name)
- {
- assert(pc);
- 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)
- {
- assert(pc);
- //判断是否为空
- if (pc->sz == 0)
- {
- printf("删除失败,通讯录为空\n");
- return;
- }
- //查找是否存在此人
- char name[NAME_MAX];
- printf("请输入被删除人名字:\n");
- scanf("%s", name);
- //查找此人,存在返回位置,不存在返回-1
- int ret = FindByName(pc,name);
- if (ret == -1)
- {
- printf("要删除的人不存在\n");
- return;
- }
- //删除(覆盖)此人
- for (int i = ret; i < pc->sz - 1; i++) //sz-1 是防止执行体越界,如果要删除的是最后一个元素,通过sz--,直接不访问,
- {
- pc->data[i] = pc->data[i + 1];
- }
- pc->sz --;
- printf("删除成功\n");
- }
跟删除同理,先查找是否存在此人,查找到了返回下标打印出来即可
- //查找联系人
- void FindContact(Contact* pc)
- {
- assert(pc);
- //判断是否为空
- if (pc->sz == 0)
- {
- printf("查找失败,通讯录为空\n");
- return;
- }
- //查找此人,存在返回位置,不存在返回-1
- char name[NAME_MAX];
- printf("请输入被查找人名字:\n");
- scanf("%s", name);
- int ret = FindByName(pc, name);
- if (ret == -1)
- {
- printf("要查找的人不存在\n");
- return;
- }
- //显示出来
- printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");
- printf("%-20s%-5d%-5s%-12s%-30s\n",
- pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
- }

查找到此人位置,记录返回,通过该位置进行修改
- //修改联系人
- void ModifyContact(Contact* pc)
- {
- assert(pc);
- //判断是否为空
- if (pc->sz == 0)
- {
- printf("修改失败,通讯录为空\n");
- return;
- }
- //查找此人,存在返回位置,不存在返回-1
- char name[NAME_MAX];
- printf("请输入被修改人名字:\n");
- scanf("%s", name);
- int ret = FindByName(pc, name);
- if (ret == -1)
- {
- printf("要查找的人不存在\n");
- return;
- }
- //修改
- printf("请输入名字:");
- scanf("%s", pc->data[ret].name);
- printf("请输入年龄:");
- scanf("%d", &(pc->data[ret].age));
- printf("请输入性别:");
- scanf("%s", pc->data[ret].sex);
- printf("请输入电话:");
- scanf("%s", pc->data[ret].tele);
- printf("请输入地址:");
- scanf("%s", pc->data[ret].addr);
-
- printf("修改成功\n");
- }
利用qsort快速排序,然后我们以名字strcmp函数来比较
- //目录排序
- //void qsort(void* base, size_t num, size_t size,
- // int (*compar)(const void*, const void*));
- int cmpare(const void* p1, const void* p2)
- {
- return strcmp(((Peo*)p1)->name, ((Peo*)p2)->name);
- }
-
- void SortContact(Contact* pc)
- {
- qsort(pc->data, pc->sz, sizeof(Peo), cmpare);
- }
增加变量capacity——用来记录通讯录容量
利用指针动态创建内存,结合malloc,realloc,calloc
- typedef struct Contact
- {
- Peo* data; //存放数据
- int sz; //记录信息人数
- int capacity; //记录的是通讯录的当前容量
- }Contact;
利用calloc 开辟动态空间给data
- #define DEFAULT_SZ 3 //默认容量
- #define DEFAULT_INC 2 //扩容量
- //动态版本的初始化
- void InitContact(Contact* pc)
- {
- assert(pc);
- pc->sz = 0;
- pc->capacity = DEFAULT_SZ;
- pc->data = calloc(pc->capacity, sizeof(Peo));
- if (pc->data == NULL)
- {
- perror("InitContact->calloc");
- return;
- }
- }
利用realloc来进行动态扩容,存放到临时变量ptr里,开辟成功给data
- //检查是否需要扩容
- void CheckCapacity(Contact* pc)
- {
- if (pc->sz == pc->capacity)
- {
- Peo* ptr = (Peo*)realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(Peo));
- if (ptr != NULL)
- {
- pc->data = ptr;
- pc->capacity += DEFAULT_INC;
- printf("增容成功\n");
- }
- else
- {
- perror("AddContact->realloc");
- return;
- }
- }
- }
- //增加联系人
- void AddContact(Contact* pc)
- {
- assert(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");
- }

因为涉及到了动态开辟,所以使用后要进行free空间
防止内存泄漏
写到EXIT退出通讯录里面,让它退出直接调用这个清空销毁函数!就算不销毁最终程序结束也会自动销毁!
- void DestroyContact(Contact* pc)
- {
- free(pc->data);
- pc->data = NULL;
- pc->sz = 0;
- pc->capacity = 0;
- }
使用文件操作,涉及到了文件缓冲区;
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。
① 从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。
② 从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓 冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。
③ 缓冲区的大小根据C编译系统决定的。
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。 如果不做,可能导致读写文件的问题。
先把信息存储起来后,在执行销毁并退出!
- //保存信息到文件
- void SaveContact(Contact* pc)
- {
- FILE* pf = fopen("contact.txt", "wb"); //二进制读文件
- if (pf == NULL)
- {
- perror("SaveContact");
- return;
- }
- //写信息到文件
- int i = 0;
- for (i = 0; i < pc->sz; i++)
- {
- //fwrite(&(pc->data[i]), sizeof(PeoInfo), 1, pf);
- fwrite(pc->data + i, sizeof(Peo), 1, pf);
- }
-
- fclose(pf);
- pf = NULL;
- }
将信息加载到文件当中,
在初始化阶段加载文件信息
- void CheckCapacity(Contact* pc);//检查上次保存的信息是否需要扩容
- void LoadContact(Contact* pc)
- {
- FILE* pf = fopen("contact.txt", "rb"); //以二进制读文件
- if (pf == NULL)
- {
- perror("LoadContact");
- return;
- }
- //读文件
- Peo tmp = { 0 }; //临时变量
- while (fread(&tmp, sizeof(Peo), 1, pf))
- {
- CheckCapacity(pc);
- pc->data[pc->sz] = tmp;
- pc->sz++;
- }
-
- fclose(pf);
- pf = NULL;
- }
-
- //文件版本的初始化函数
- void InitContact(Contact* pc)
- {
- assert(pc);
-
- pc->sz = 0;
- pc->capacity = DEFAULT_SZ;
- pc->data = calloc(pc->capacity, sizeof(Peo));
- if (pc->data == NULL)
- {
- perror("InitContact->calloc");
- return;
- }
- //加载文件中的信息到通讯录
- LoadContact(pc);
- }

- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include "contact.h"
- void menu()
- {
- printf("<-==============通讯录=============->\n");
- printf("<-==========1.增加联系人===========->\n");
- printf("<-==========2.删除联系人===========->\n");
- printf("<-==========3.查找联系人===========->\n");
- printf("<-==========4.修改联系人===========->\n");
- printf("<-==========5.打印通讯录===========->\n");
- printf("<-==========6.排序通讯录===========->\n");
- printf("<-==========0.退出通讯录===========->\n");
- printf("<-=================================->\n");
- }
- enum Option
- {
- EXIT, //0
- ADD,
- DEL,
- SEARCH,
- MODIFY,
- SHOW,
- SORT
- };
- int main()
- {
- int input = 0;
- Contact con; //创建通讯录
- //初始化通讯录
- InitContact(&con);
- do
- {
- //菜单
- menu();
- printf("请输入操作:");
- scanf("%d", &input);
- switch (input)
- {
- case ADD:
- printf("增加联系人\n");
- AddContact(&con);
- break;
- case DEL:
- printf("删除联系人\n");
- DelContact(&con);
- break;
- case SEARCH:
- printf("查找联系人\n");
- FindContact(&con);
- break;
- case MODIFY:
- printf("修改联系人\n");
- ModifyContact(&con);
- break;
- case SHOW:
- printf("打印联系人\n");
- ShowContact(&con);
- break;
- case SORT:
- printf("排序联系人\n");
- SortContact(&con);
- break;
- case EXIT:
- printf("退出通讯录\n");
- SaveContact(&con);
- DestroyContact(&con);
- break;
- default:
- printf("输入错误,重新输入\n");
- break;
- }
- } while (input);
- return 0;
- }
- #define _CRT_SECURE_NO_WARNINGS 1
- #include "contact.h"
-
- 静态-初始化通讯录
- //void InitContact(Contact* pc)
- //{
- // assert(pc);
- // pc->sz = 0;
- // memset(pc->data, 0, sizeof(pc->data));
- //}
- 动态版本的初始化
- //void InitContact(Contact* pc)
- //{
- // assert(pc);
- // pc->sz = 0;
- // pc->capacity = DEFAULT_SZ;
- // pc->data = calloc(pc->capacity, sizeof(Peo));
- // if (pc->data == NULL)
- // {
- // perror("InitContact->calloc");
- // return;
- // }
- //}
- void CheckCapacity(Contact* pc);//检查上次保存的信息是否需要扩容
- void LoadContact(Contact* pc)
- {
- FILE* pf = fopen("contact.txt", "rb");
- if (pf == NULL)
- {
- perror("LoadContact");
- return;
- }
- //读文件
- Peo tmp = { 0 };
- while (fread(&tmp, sizeof(Peo), 1, pf))
- {
- CheckCapacity(pc);
- pc->data[pc->sz] = tmp;
- pc->sz++;
- }
-
- fclose(pf);
- pf = NULL;
- }
-
- //文件版本的初始化函数
- void InitContact(Contact* pc)
- {
- assert(pc);
-
- pc->sz = 0;
- pc->capacity = DEFAULT_SZ;
- pc->data = calloc(pc->capacity, sizeof(Peo));
- if (pc->data == NULL)
- {
- perror("InitContact->calloc");
- return;
- }
- //加载文件中的信息到通讯录
- LoadContact(pc);
- }
- //
- 静态增加联系人
- //void AddContact(Contact* pc)
- //{
- // assert(pc);
- // //判断通讯录是否满了
- // if (pc->sz == DATA_MAX)
- // {
- // 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);
- // //对sz增加,
- // pc->sz++;
- // printf("增加成功\n");
- //}
- void DestroyContact(Contact* pc)
- {
- free(pc->data);
- pc->data = NULL;
- pc->sz = 0;
- pc->capacity = 0;
- }
- //检查是否需要扩容
- void CheckCapacity(Contact* pc)
- {
- if (pc->sz == pc->capacity)
- {
- Peo* ptr = (Peo*)realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(Peo));
- if (ptr != NULL)
- {
- pc->data = ptr;
- pc->capacity += DEFAULT_INC;
- printf("增容成功\n");
- }
- else
- {
- perror("AddContact->realloc");
- return;
- }
- }
- }
- //增加联系人
- void AddContact(Contact* pc)
- {
- assert(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");
- }
-
- //显示所有的联系人
- void ShowContact(const Contact* pc)
- {
- assert(pc);
- //判断通讯录内是否有信息
- if (pc->sz == 0)
- {
- printf("打印失败,通讯录为空\n");
- return;
- }
- //打印
- //打印标题
- printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");
- //打印信息
- int i = 0;
- for (i = 0; i < pc->sz; i++)
- {
- //打印每个人的信息
- printf("%-20s%-5d%-5s%-12s%-30s\n",
- pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
- }
- }
-
- //通过名字查找被删除人
- static int FindByName(Contact* pc, char* name)
- {
- assert(pc);
- 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)
- {
- assert(pc);
- //判断是否为空
- if (pc->sz == 0)
- {
- printf("删除失败,通讯录为空\n");
- return;
- }
- //查找是否存在此人
- char name[NAME_MAX];
- printf("请输入被删除人名字:\n");
- scanf("%s", name);
- //查找此人,存在返回位置,不存在返回-1
- int ret = FindByName(pc,name);
- if (ret == -1)
- {
- printf("要删除的人不存在\n");
- return;
- }
- //删除(覆盖)此人
- for (int i = ret; i < pc->sz - 1; i++) //sz-1 是防止执行体越界,如果要删除的是最后一个元素,通过sz--,直接不访问,
- {
- pc->data[i] = pc->data[i + 1];
- }
- pc->sz--;
- printf("删除成功\n");
- }
-
- //查找联系人
- void FindContact(Contact* pc)
- {
- assert(pc);
- //判断是否为空
- if (pc->sz == 0)
- {
- printf("查找失败,通讯录为空\n");
- return;
- }
- //查找此人,存在返回位置,不存在返回-1
- char name[NAME_MAX];
- printf("请输入被查找人名字:\n");
- scanf("%s", name);
- int ret = FindByName(pc, name);
- if (ret == -1)
- {
- printf("要查找的人不存在\n");
- return;
- }
- //显示出来
- printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");
- printf("%-20s%-5d%-5s%-12s%-30s\n",
- pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
- }
-
- //修改联系人
- void ModifyContact(Contact* pc)
- {
- assert(pc);
- //判断是否为空
- if (pc->sz == 0)
- {
- printf("修改失败,通讯录为空\n");
- return;
- }
- //查找此人,存在返回位置,不存在返回-1
- char name[NAME_MAX];
- printf("请输入被修改人名字:\n");
- scanf("%s", name);
- int ret = FindByName(pc, name);
- if (ret == -1)
- {
- printf("要查找的人不存在\n");
- return;
- }
- //修改
- printf("请输入名字:");
- scanf("%s", pc->data[ret].name);
- printf("请输入年龄:");
- scanf("%d", &(pc->data[ret].age));
- printf("请输入性别:");
- scanf("%s", pc->data[ret].sex);
- printf("请输入电话:");
- scanf("%s", pc->data[ret].tele);
- printf("请输入地址:");
- scanf("%s", pc->data[ret].addr);
-
- printf("修改成功\n");
- }
-
- //目录排序
- //void qsort(void* base, size_t num, size_t size,
- // int (*compar)(const void*, const void*));
- int cmpare(const void* p1, const void* p2)
- {
- return strcmp(((Peo*)p1)->name, ((Peo*)p2)->name);
- }
-
- void SortContact(Contact* pc)
- {
- qsort(pc->data, pc->sz, sizeof(Peo), cmpare);
- }
- //保存信息到文件
- void SaveContact(Contact* pc)
- {
- FILE* pf = fopen("contact.txt", "wb"); //二进制读文件
- if (pf == NULL)
- {
- perror("SaveContact");
- return;
- }
- //写信息到文件
- int i = 0;
- for (i = 0; i < pc->sz; i++)
- {
- //fwrite(&(pc->data[i]), sizeof(PeoInfo), 1, pf);
- fwrite(pc->data + i, sizeof(Peo), 1, pf);
- }
-
- fclose(pf);
- pf = NULL;
- }
- #pragma once
- #include
- #include
- #include
- #define NAME_MAX 20
- #define SEX_MAX 5
- #define TELE_MAX 12
- #define ADDR_MAX 30
-
- #define DATA_MAX 100
-
- #define DEFAULT_SZ 3 //默认容量
- #define DEFAULT_INC 2 //扩容量
-
- typedef struct Peo //个人信息结构体
- {
- char name[NAME_MAX];
- int age;
- char sex[SEX_MAX];
- char tele[TELE_MAX];
- char addr[ADDR_MAX];
- }Peo;
- typedef struct Contact
- {
- Peo* data;//存放数据
- int sz; //记录信息人数
- int capacity;//记录的是通讯录的当前容量
- }Contact;
-
- //初始化通讯录
- //void InitContact(Contact* pc);
-
- //动态版本的初始化
- void InitContact(Contact* pc);
-
- //增加联系人
- void AddContact(Contact* pc);
-
- //显示所有的联系人
- void ShowContact(const Contact* pc);
-
- //删除联系人
- void DelContact(Contact* pc);
-
- //查找联系人
- void FindContact(Contact* pc);
-
- //修改联系人
- void ModifyContact(Contact* pc);
-
- //排序联系人
- void SortContact(Contact* pc);
-
- //销毁通讯录
- void DestroyContact(Contact* pc);
-
- //保存信息到文件
- void SaveContact(Contact* pc);
-
- //加载文件信息到通讯录
- void LoadContact(Contact* pc);
以上就是利用三章知识点结合做的小项目——通讯录;
文中不足之处还望指点,感激不尽
