C语言学习笔记20260629-分文件通讯录完整实现
C语言学习笔记20260629-分文件通讯录完整实现项目概述本项目实现了一个基于控制台的通讯录管理系统采用多文件工程结构3文件拆分将声明、实现与测试分离是C语言工程化开发的经典实践。功能需求最多存储 100 人每人信息包含姓名、年龄、性别、电话、地址支持功能增、删、查、改、排序、显示全部工程结构contact.h → 头文件结构体定义 函数声明 contact.c → 源文件所有功能函数的具体实现 stu20260629.c → 测试文件main函数 菜单交互界面核心设计思想数据结构设计通讯录的核心是两个嵌套的结构体采用顺序表数组实现结构// 单人信息结构体typedefstructPeoInfo{charname[NAME_LEN];intage;charsex[SEX_LEN];chartel[TEL_LEN];charaddr[ADDR_LEN];}PeoInfo;// 通讯录结构体typedefstructContact{PeoInfo data[MAX_PEOPLE];// 存放所有人的数组intcount;// 当前有效人数}Contact;文件一contact.h头文件作用头文件是整个工程的接口说明书包含宏定义、结构体类型和函数声明。#ifndef__CONTACT_H__#define__CONTACT_H__#includestdio.h#includestring.h#includestdlib.h#defineMAX_PEOPLE100#defineNAME_LEN20#defineSEX_LEN6#defineTEL_LEN15#defineADDR_LEN30// 单人信息结构体typedefstructPeoInfo{charname[NAME_LEN];intage;charsex[SEX_LEN];chartel[TEL_LEN];charaddr[ADDR_LEN];}PeoInfo;// 通讯录结构体typedefstructContact{PeoInfo data[MAX_PEOPLE];intcount;// 当前有效联系人个数}Contact;// 初始化通讯录voidInitContact(Contact*pc);// 1. 新增联系人voidAddContact(Contact*pc);// 2. 显示所有联系人voidShowContact(constContact*pc);// 3. 查找联系人按姓名返回下标无则-1intFindByName(constContact*pc,charname[]);// 4. 删除指定联系人voidDelContact(Contact*pc);// 5. 修改联系人信息voidModifyContact(Contact*pc);// 6. 搜索联系人并打印voidSearchContact(constContact*pc);// 7. 按姓名排序联系人voidSortContact(Contact*pc);#endif关键细节头文件守卫防止重复包含const修饰只读函数参数使用const标准库包含stdio.h、string.h、stdlib.h文件二contact.c功能实现作用所有功能函数的具体实现都放在这里。#includecontact.h// 初始化通讯录voidInitContact(Contact*pc){pc-count0;memset(pc-data,0,sizeof(pc-data));}// 新增联系人voidAddContact(Contact*pc){if(pc-countMAX_PEOPLE){printf(通讯录已满无法添加\n);return;}printf(请输入姓名);scanf(%s,pc-data[pc-count].name);printf(请输入年龄);scanf(%d,pc-data[pc-count].age);printf(请输入性别);scanf(%s,pc-data[pc-count].sex);printf(请输入电话);scanf(%s,pc-data[pc-count].tel);printf(请输入地址);scanf(%s,pc-data[pc-count].addr);pc-count;printf(添加成功\n);}// 显示全部联系人voidShowContact(constContact*pc){if(pc-count0){printf(通讯录为空\n);return;}printf(%-10s %-5s %-6s %-15s %-20s\n,姓名,年龄,性别,电话,地址);for(inti0;ipc-count;i){printf(%-10s %-5d %-6s %-15s %-20s\n,pc-data[i].name,pc-data[i].age,pc-data[i].sex,pc-data[i].tel,pc-data[i].addr);}}// 根据姓名查找返回下标找不到返回-1intFindByName(constContact*pc,charname[]){for(inti0;ipc-count;i){if(strcmp(pc-data[i].name,name)0){returni;}}return-1;}// 删除联系人voidDelContact(Contact*pc){if(pc-count0){printf(通讯录为空无需删除\n);return;}charname[NAME_LEN];printf(请输入要删除的姓名);scanf(%s,name);intposFindByName(pc,name);if(pos-1){printf(未找到该联系人\n);return;}// 后续数据前移覆盖for(intipos;ipc-count-1;i){pc-data[i]pc-data[i1];}pc-count--;printf(删除成功\n);}// 修改联系人voidModifyContact(Contact*pc){if(pc-count0){printf(通讯录为空\n);return;}charname[NAME_LEN];printf(请输入要修改的姓名);scanf(%s,name);intposFindByName(pc,name);if(pos-1){printf(未找到该联系人\n);return;}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].tel);printf(请输入新地址);scanf(%s,pc-data[pos].addr);printf(修改完成\n);}// 查找并打印联系人voidSearchContact(constContact*pc){if(pc-count0){printf(通讯录为空\n);return;}charname[NAME_LEN];printf(请输入要查找的姓名);scanf(%s,name);intposFindByName(pc,name);if(pos-1){printf(未找到该联系人\n);return;}printf(查询结果\n);printf(%-10s %-5s %-6s %-15s %-20s\n,姓名,年龄,性别,电话,地址);printf(%-10s %-5d %-6s %-15s %-20s\n,pc-data[pos].name,pc-data[pos].age,pc-data[pos].sex,pc-data[pos].tel,pc-data[pos].addr);}// 按姓名升序排序冒泡排序voidSortContact(Contact*pc){if(pc-count1){printf(联系人数量不足无需排序\n);return;}for(inti0;ipc-count-1;i){for(intj0;jpc-count-1-i;j){if(strcmp(pc-data[j].name,pc-data[j1].name)0){PeoInfo temppc-data[j];pc-data[j]pc-data[j1];pc-data[j1]temp;}}}printf(排序完成\n);}核心算法解析删除操作数据前移覆盖时间复杂度O(N)查找操作字符串比较使用strcmp排序操作冒泡排序配合strcmp时间复杂度O(N²)文件三stu20260629.c主程序作用提供用户交互界面菜单调用contact.h中声明的函数。#includecontact.hvoidMenu(){printf(通讯录\n);printf(1. 新增联系人 2. 删除联系人\n);printf(3. 查找联系人 4. 修改联系人\n);printf(5. 联系人排序 6. 显示全部\n);printf(0. 退出程序\n);printf(\n);printf(请输入功能序号);}intmain(){Contact con;InitContact(con);intinput0;do{Menu();scanf(%d,input);switch(input){case1:AddContact(con);break;case2:DelContact(con);break;case3:SearchContact(con);break;case4:ModifyContact(con);break;case5:SortContact(con);break;case6:ShowContact(con);break;case0:printf(程序退出再见\n);break;default:printf(输入错误请重新选择\n);break;}printf(\n);}while(input!0);return0;}运行示例通讯录 1. 新增联系人 2. 删除联系人 3. 查找联系人 4. 修改联系人 5. 联系人排序 6. 显示全部 0. 退出程序 请输入功能序号1 请输入姓名张三 请输入年龄25 请输入性别男 请输入电话11112223456 请输入地址北京 添加成功知识点总结关键技术点知识点说明多文件工程.h声明、.c实现、分离编译头文件守卫#ifndef / #define / #endif防止重复包含结构体嵌套Contact中包含PeoInfo数组指针传参大结构体用指针传递避免拷贝开销const修饰只读参数加const提高安全性字符串比较用strcmp而非顺序表删除删除后后续元素前移覆盖冒泡排序配合strcmp实现字符串排序memset批量初始化内存为0拓展思考输入安全性可改用fgets防止缓冲区溢出动态扩容可改用mallocrealloc实现动态数组文件持久化增加保存到文件/从文件加载功能排序优化数据量大时可改用快速排序qsort