这里附上上一篇通讯录博客的链接
【C语言】通讯录_Brant_zero的博客-CSDN博客

目录

一、头文件

二、函数功能实现

三、主函数


一、头文件

//头文件
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>//定义的常量
#define Arr_Max 100
#define Name_Max 20
#define Sex_Max 5
#define PhoneNumber_Max 12
#define Address_Max  20//枚举
enum num
{EXIT,ADD,DEL,SEARCH,MODIFY,SORT,PRINT,DESTROY,LOAD
};
//个人信息结构体
typedef struct PeoInfo
{char name[Name_Max];char sex[Sex_Max];int age;char tele[PhoneNumber_Max];char addr[Address_Max];
}PeoInfo;//总结构体
typedef struct AllPeoInfo
{PeoInfo* arr;int sz;int Max;
}AllPeoInfo;//函数声明
//菜单
void mean();//初始化通讯录   清空通讯录
void IntPeoInfo(AllPeoInfo* p1);
//添加通讯人
void ADD_PeoInfo(AllPeoInfo* p1);
//删除通讯人
void DEL_PeoInfo(AllPeoInfo* p1);
//修改通讯录
void MODIFY_PeoInfo(AllPeoInfo* p1);
//查找联系人
int  SEARCH_PeoInfo(AllPeoInfo* p1);
//排序联系人
void SORT_PeoInfo(AllPeoInfo* p1);
//打印通讯录
void Printf_PeoInfo(AllPeoInfo* p1);
//销毁通讯录
void Destroy_Contact(AllPeoInfo* p1);
//保存通讯录
void Save_Contact(AllPeoInfo* p1);
//加载通讯录
void Load_Contact(AllPeoInfo* p1);

二、函数功能实现

#define _CRT_SECURE_NO_WARNINGS 1
#include "head.h"
void mean()
{printf("*****************************\n");printf("****  1.add     2.del    ****\n");printf("****  3.search  4.modify ****\n");printf("****  5.sort    6.print  ****\n");printf("****  7.clean   8.load   ****\n");printf("****  0.exit             ****\n");printf("*****************************\n");}//初始化总结构体---静态
//void IntPeoInfo(AllPeoInfo* p1)
//{
//  p1->sz = 0;
//  memset(p1->arr, 0, sizeof(p1->arr));
//}//通讯录的初始化:
void IntPeoInfo(AllPeoInfo* p1)
{p1->sz = 0;p1->Max = 3;p1->arr = (PeoInfo*)malloc(sizeof(PeoInfo) * 3);//检查malloc是否开辟失败:if (p1->arr == NULL){perror("IntPeoInfo::malloc");return;}//将开辟的空间初始化为0;memset(p1->arr, 0, sizeof(PeoInfo) * 3);
}//检查通讯录是否需要增容
void Check_Max(AllPeoInfo* p1)
{if (p1->sz == p1->Max){PeoInfo* temp;          //一定要创建一个temp变量来判断relloc的开辟是否成功,要不然arr即丢失了空间又丢失以前的地址temp = (PeoInfo*)realloc(p1->arr, (p1->Max + 2) * sizeof(PeoInfo));if (temp != NULL)      //判断relloc是否开辟成功;{p1->arr = temp;}else{perror("ADD_PeoInfo::relloc");return;}p1->Max = p1->Max + 2;printf("增容成功\n");}
}//加载信息到通讯录
void Load_Contact(AllPeoInfo* p1)
{//打开文件FILE* P = fopen("contact.txt", "rb");if (P == NULL){perror("Loar_Contact_Open::");}//读文件//返回读到的个数PeoInfo temp = { 0 };while (fread(&temp, sizeof(PeoInfo), 1, P)){Check_Max(p1);p1->arr[p1->sz] = temp;//一定要记得+1;p1->sz++;}//关闭文件fclose(P);
}//if (p1->sz == p1->Max)
//{
//  printf("人数已满\n");
//}//如果sz等于Max
//进行扩容://添加联系人信息
void ADD_PeoInfo(AllPeoInfo* p1)
{Check_Max(p1);printf("请输入姓名:\n");scanf("%s", (p1->arr)[p1->sz].name);printf("请输入性别:\n");scanf("%s", (p1->arr)[p1->sz].sex);printf("请输入年龄:\n");scanf("%d", &((p1->arr)[p1->sz].age));printf("请输入电话:\n");scanf("%s", (p1->arr)[p1->sz].tele);printf("请输入住址:\n");scanf("%s", (p1->arr)[p1->sz].addr);p1->sz++;printf("添加成功\n");
}//删除通讯人
void DEL_PeoInfo(AllPeoInfo* p1)
{int posi = SEARCH_PeoInfo(p1);int i = 0;if (posi >= 0) //成功找到才开始删除{for (i = posi; i < p1->sz - 1; i++){p1->arr[i] = p1->arr[i + 1];}p1->sz--;printf("删除成功\n\n");}
}//查找联系人
int  SEARCH_PeoInfo(AllPeoInfo* p1)
{printf("请输入联系人的姓名\n");char name[20] = { 0 };scanf("%s", name);int i = 0;for (i = 0; i < p1->sz; i++){if (0 == strcmp(p1->arr[i].name, name))return i;}printf("查无此人");return -1;}//打印通讯录
void Printf_PeoInfo(AllPeoInfo* p1)
{printf("%-20s %-6s %-6s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "住址");int i = 0;for (i = 0; i < p1->sz; i++){printf("%-20s %-6s %-6d %-15s %-20s\n",p1->arr[i].name, p1->arr[i].sex, p1->arr[i].age, p1->arr[i].tele, p1->arr[i].addr);}
}//修改联系人
void MODIFY_PeoInfo(AllPeoInfo* p1)
{int posi = SEARCH_PeoInfo(p1);if (posi == -1){return;}printf("请输入姓名:\n");scanf("%s", (p1->arr)[posi].name);printf("请输入性别:\n");scanf("%s", (p1->arr)[posi].sex);printf("请输入年龄:\n");scanf("%d", &((p1->arr)[posi].age));printf("请输入电话:\n");scanf("%s", (p1->arr)[posi].tele);printf("请输入住址:\n");scanf("%s", (p1->arr)[posi].addr);printf("修改成功\n");
}//年龄排序
size_t compare_age(const void*r1,const void*r2)
{return (((PeoInfo*)r1)->age) - ((PeoInfo*)r2)->age;
}
By_age_sort(AllPeoInfo* p1)
{qsort(p1->arr, p1->sz, sizeof(p1->arr[0]), compare_age);}//姓名排序
size_t compare_name(const void* r1, const void* r2)
{return strcmp(((PeoInfo*)r1)->name, ((PeoInfo*)r2)->name);
}
By_name_sort(AllPeoInfo* p1)
{//传结构体数组的地址,比较结构体数组中name的字符串大小.qsort(p1->arr,p1->sz,sizeof(p1->arr[0]), compare_name);
}//排序联系人
void SORT_PeoInfo(AllPeoInfo* p1)
{printf("******************************************\n");printf("****  1.年龄排序    2.姓名首字符排序  ****\n");printf("******************************************\n");int x = 0;scanf("%d", &x);switch (x){//年龄排序case 1:By_age_sort(p1);break;//姓名排序case 2:By_name_sort(p1);break;default:printf("输入错误\n");break;}printf("排序成功\n");}//销毁通讯录
void Destroy_Contact(AllPeoInfo* p1)
{free(p1->arr);p1->arr = NULL;p1->Max = 0;p1->sz = 0;printf("通讯录销毁成功,成功退出\n");}//将信息保存到文件中
void Save_Contact(AllPeoInfo* p1)
{FILE* P = fopen("contact.txt", "wb");if (P == NULL){perror("Save_contact:fopen");return ;}//写文件int i = 0;for (i = 0; i < p1->sz; i++){fwrite(p1->arr + i, sizeof(PeoInfo), 1, P);}//关闭文件fclose(P);P = NULL;
}

三、主函数

#include "head.h"
void text()
{//通讯录创建AllPeoInfo Text_Contact;//初始化通讯录数组IntPeoInfo(&Text_Contact);int input = 0;do{mean();printf("请输入操作数:\n");scanf("%d", &input);switch (input){case EXIT: printf("保存并退出成功\n");Save_Contact(&Text_Contact);return;break;case ADD:ADD_PeoInfo(&Text_Contact);break;case DEL:DEL_PeoInfo(&Text_Contact);break;case SEARCH:SEARCH_PeoInfo(&Text_Contact);break;case MODIFY:MODIFY_PeoInfo(&Text_Contact);break;case SORT:SORT_PeoInfo(&Text_Contact);break;case PRINT:Printf_PeoInfo(&Text_Contact);break;case DESTROY:Destroy_Contact(&Text_Contact);printf("清空成功\n");break;case LOAD:Load_Contact(&Text_Contact);printf("数据加载成功\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);
}
int main()
{text();
}

希望大家能留下一个赞哦,你的三连就是我写博客的动力!!!

谢谢各位,我们下次再见。

【C语言】通讯录——源代码相关推荐

  1. 输出 Hello World 混乱C语言的源代码

    下面的六个程序片段主要完成这些事情: 输出Hello, World 混乱C语言的源代码 下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C 的编译器g 才能编程通过. lns=" ...

  2. iar环境下c语言编程,c语言_源代码-iar环境配置.pdf

    c语言_源代码-iar环境配置 欢迎光临我的博客:/mikehendry 其实,IAR 编译环境的配置是相当重要的,没配置正确或者不符合自己的习惯的话,使用起来就会很麻烦.下面 我根据网上的经验和资料 ...

  3. c语言hypot函数,hypot ( )【C语言库函数源代码】

    [C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] /* hypot函数对于给定的直角三角形的两个直角边, 求其斜边的长度. */ //一般的常规算法: doublemy_ ...

  4. 51单片机c语言程序控制,51单片机C语言程序设计源代码

    <51单片机C语言程序设计源代码>由会员分享,可在线阅读,更多相关<51单片机C语言程序设计源代码(281页珍藏版)>请在人人文库网上搜索. 1.51 SCM c语言教程示例2 ...

  5. pow ( )【C语言库函数源代码】

    [C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] double my_pow(double x, double y) { register double ret, val ...

  6. fabs ( )【C语言库函数源代码】

    [C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] float my_fabs01 (float fnumber) { float ret; __asm__ ( " ...

  7. c语言象棋教程下载,C语言程序源代码中国象棋.doc-资源下载在线文库www.lddoc.cn...

    C语言程序源代码---中国象棋.doc includegraphics.hincludeconio.hincludestring.hincludebios.hincludestdlib.hinclud ...

  8. 用c 语言做课程表系统代码,[计算机]C语言课程表源代码.doc

    [计算机]C语言课程表源代码 #include #include #include char course[10][7][10]; //用于存储课程表中的课程 void saveCourse(); / ...

  9. LinuxC语言——通讯录

    LinuxC语言--通讯录 制作通讯录的一些基础知识 功能 代码 链表节点创建 节点插入 增加节点到链表头 节点插入 增加节点到链表尾部 节点查找(姓名.号码) 节点删除 显示节点 主函数逻辑 运行效 ...

  10. c语言stricmp函数,stricmp ( )【C语言库函数源代码】

    [C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] /* _stricmp/_strcmpi perform a case-insensitive string compa ...

最新文章

  1. 为什么苹果 M1 芯片如此之快?
  2. PostCSS理解与运用
  3. 查询最近一千条数据mysql_保留mysql数据库中的最新1000条记录
  4. 一种在网络层清理机器假死时TCP连接的方案介绍
  5. 查看mysql view作用_Mysql中View视图的作用
  6. ubuntu开启root登陆
  7. SPH(光滑粒子流体动力学)流体模拟实现三:Marching Cube算法(2)
  8. 2019年前端开发10大战略性技术蓝图
  9. 程序员的代码行数越少越好?
  10. 微信企业号支付个人php实现
  11. stringbuilder为什么线程不安全_String Builder 为什么线程不安全?
  12. 如何提高测试的工作效率?都有哪些具体手段?
  13. 解决本地笔记导入博客中图片无法显示的问题
  14. 模指数运算之python实现
  15. oracle数据库rac切换,RAC切换归档模式
  16. LeetCode 1240. Tiling a Rectangle with the Fewest Squares
  17. 通过Htpp访问svn内容
  18. java 实现金额大小写转换
  19. 三针重叠问题算法整理
  20. outlook 默认打开ie_如何使用OUTLOOK联系人取代手机联系人,实现电脑和手机联系人、日历、待办的同步...

热门文章

  1. 学习周记1:2019.2.18-2019.2.24
  2. espn配置路由_华为敏捷网络解决方案.ppt
  3. Linux基线检查( 一)
  4. 超级计算机 任务提交,超算任务提交系统slurm用法
  5. 做好公司各部门数据报表支撑的几个简单思维
  6. mysql 关联查询
  7. 使用二分法来解决的一些问题
  8. 自定义NavigationBar的思路
  9. java并发包线程池原理分析锁的深度化
  10. 模糊查询和sql语句的拼接