本通讯录具体实现以下功能:

实现结果如下

其中排序分为姓名排序和年龄排序

附源码:

测试部分——

void menu()
{printf("*******************************************\n");printf("*******1.添加联系人     2.删除联系人*******\n");printf("*******3.查找联系人     4.修改联系人*******\n");printf("*******5.查看通讯录     6.排序联系人*******\n");printf("***************** 0.退出 ******************\n");
}
int main()
{int input = 0;contacts x;//创建通讯录结构体变量xInit_contacts(&x);//初始化通讯录do {menu();printf("请选择: >");scanf("%d", &input);switch (input){case 添加联系人:contacts_add(&x);break;case 删除联系人:contacts_delete(&x);break;case 查找联系人:contacts_search(&x);break;case 修改联系人:contacts_modify(&x);break;case 查看通讯录:contacts_show(&x);break;case 排序联系人:contacts_sort(&x);break;case 退出://销毁通讯录,销毁动态开辟的内存Savecontact(&x);Destroy(&x);printf("退出.");break;default:printf("输入错误数字!\n");break;}} while (input);return 0;
}

函数实现部分——

void Checkcapacity(struct contacts* p)
{if (p->capacity <= p->sz){//增加容量info* tmp=(info*)realloc(p->x, (p->capacity * 2) * sizeof(info));if (tmp != NULL){p->x = tmp;p->capacity *= 2;}}
}
void Readcontact(struct contacts* p)
{info tmp = { 0 };FILE* pf = fopen("contacts.data", "rb");if (pf == NULL){printf("%s\n", strerror(errno));return;}while (fread(&tmp, sizeof(struct info), 1, pf)){Checkcapacity(p);p->x[p->sz] = tmp;p->sz++;}
}
void Init_contacts(struct contacts* p)
{p->x = (info*)malloc(DEFAULT_SZ * sizeof(info));//默认通讯录存放三个联系人if (p->x == NULL){return;}else{p->sz = 0;p->capacity = DEFAULT_SZ;}Readcontact(p);
}
void contacts_add(struct contacts* p)
{//检测通讯录容量//满了就增加容量Checkcapacity(p);printf("请输入姓名:>");scanf("%s", p->x[p->sz].name);printf("请输入年龄:>");scanf("%d", &p->x[p->sz].age);printf("请输入性别:>");scanf("%s", p->x[p->sz].sex);printf("请输入电话:>");scanf("%s", p->x[p->sz].tele);printf("请输入住址:>");scanf("%s", p->x[p->sz].address);printf("添加成功!\n");p->sz++;
}void contacts_delete(struct contacts*p)
{if (p->sz == 0){printf("无联系人可删除\n");}else{char name[MAX_NAME] = { 0 };printf("请输入要删除的联系人姓名:>");scanf("%s", name);int ret=Findbyname(p, name);//查找联系人//删除联系人if (ret == -1){printf("查无此联系人\n");}else{/*memmove(&(p->x[i]),&(p->x[i+1]),(p->sz-i)*sizeof(struct contacts));*/int j = ret;for (j = ret; j < p->sz-1; j++){p->x[j] = p->x[j + 1];}p->sz--;}}
}void contacts_search(struct contacts* p)
{char name[MAX_NAME] = { 0 };printf("请输入联系人姓名:>");scanf("%s", name);int ret = Findbyname(p, name);if (ret == -1){printf("查无此人!\n");}else{printf("%-5s\t%-4s\t%-5s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "住址");printf("%-5s\t%-4d\t%-5s\t%-15s\t%-20s\n",p->x[ret].name,p->x[ret].age,p->x[ret].sex,p->x[ret].tele,p->x[ret].address);}
}void contacts_modify(struct contacts* p)
{char name[MAX_NAME] = { 0 };printf("请输入要修改的联系人姓名:>");scanf("%s", name);int ret = Findbyname(p, name);if (ret == -1)printf("查无此人\n");else{printf("请输入姓名:>");scanf("%s", p->x[ret].name);printf("请输入年龄:>");scanf("%d", &p->x[ret].age);printf("请输入性别:>");scanf("%s", p->x[ret].sex);printf("请输入电话:>");scanf("%s", p->x[ret].tele);printf("请输入住址:>");scanf("%s", p->x[ret].address);printf("修改成功!\n");}
}void contacts_show(const struct contacts*p)
{if (p->sz == 0){printf("联系人为空!\n");}else{printf("%-5s\t%-4s\t%-5s\t%-15s\t%-20s\n","姓名","年龄","性别","电话","住址");int i = 0;for (i = 0; i < p->sz; i++){printf("%-5s\t%-4d\t%-5s\t%-15s\t%-20s\n",p->x[i].name,p->x[i].age,p->x[i].sex,p->x[i].tele,p->x[i].address);}}
}void contacts_sort(struct contacts* p)
{int input = 0;printf("请选择排序方式:>\n");printf("1.姓名    2.年龄\n");scanf("%d", &input);switch (input){case 1:qsort(p->x, p->sz,sizeof(info), name_cmp);break;case 2:qsort(p->x, p->sz, sizeof(info), age_cmp);break;default:printf("选择错误\n");break;}
}
int name_cmp(const void* e1,const void*e2)
{return strcmp(((info*)e1)->name, ((info*)e2)->name);
}
int age_cmp(const void* e1, const void* e2)
{return ((info*)e1)->age - ((info*)e2)->age;
}
void Savecontact(struct contacts* p)
{FILE* pf = fopen("contacts.data", "wb");if (pf == NULL){printf("%s\n", strerror(errno));return;}int i = 0;for (i = 0; i < p->sz; i++){fwrite(&(p->x[i]),sizeof(struct info),1,pf);}fclose(pf);pf = NULL;
}
void Destroy(struct contacts* p)
{free(p->x);p->x = NULL;
}
static int Findbyname(const struct contacts* p, char* name)
{int i = 0;for (i = 0; i < p->sz; i++){if (strcmp(p->x[i].name, name) == 0){return i;}}if (i == p->sz){return -1;}
}

头文件部分——

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>#define DEFAULT_SZ 3
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 15
#define MAX_ADDRESS 30enum menu
{退出,添加联系人,删除联系人,查找联系人,修改联系人,查看通讯录,排序联系人
};typedef struct info {char name   [MAX_NAME]   ;int  age                 ;char sex    [MAX_SEX]    ;char tele   [MAX_TELE]   ;char address[MAX_ADDRESS];
}info;typedef struct contacts {info* x;int capacity;//当前通讯录的最大容量int sz;//记录当前已有联系人数
}contacts;void Init_contacts(struct contacts* p);
void contacts_add(struct contacts* p);
void contacts_delete(struct contacts* p);
void contacts_search(struct contacts* p);
void contacts_modify(struct contacts* p);
void contacts_show(const struct contacts* p);
void contacts_sort(struct contacts* p);
void Destroy(struct contacts* p);
void Savecontact(struct contacts* p);
int name_cmp(const void* e1, const void* e2);
int age_cmp(const void* e1, const void* e2)

//作者定期分享C语言学习路上的经验,欢迎关注哦

(增删查改+排序+文件存储)通讯录实现(附源码)相关推荐

  1. Flask+VUE 实现页面增删改查显示开发+测试(图文教程附源码)

    目录 一.新建项目并初始化 二.安装依赖 axios.elementUI 三.Vue代码 四.进行接口联调 五.后端接口优化 六.web页面功能测试 七.总结 八.展望 九.附录(截止发文时的代码) ...

  2. VC++设置文件最后修改时间(附源码)

      VC++开发常用功能一系列文章 (欢迎订阅,持续更新...) 第21章:VC++设置文件最后修改时间(附源码) 源代码demo已上传到百度网盘:永久生效  ,代码实现了设置文件最后修改时间 上一篇 ...

  3. Java实现图书借阅管理系统(IO流存储数据,附源码)

    目录 前言 一.项目概述 1.项目功能结构图 2.项目功能说明 3.项目其他说明 二.开发过程中需要注意的问题 1.开发顺序及思路 2.IO流读写 3.数据共享 4.业务逻辑问题 三.源码链接 前言 ...

  4. 20行Python代码爬取2W多条音频文件素材【内附源码+详细解析】新媒体创作必备

    大家好,我是辣条. 今天的内容稍显简单,不过对于新媒体创作的朋友们还是很有帮助的,你能用上的话记得给辣条三连! 爬取目标 网站:站长素材 工具使用 开发工具:pycharm 开发环境:python3. ...

  5. java毕业设计投标文件在线制作系统(附源码、数据库)

    项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  6. Java小案例(二) 用数组实现增删查改排序

    文章目录 案例一 案例二 案例三 案例四 案例五 案例一 Student.Java package curd;public class Student {private String stuid;pr ...

  7. vue---数据增删查改,野狗存储数据

    学习vue系列课程时,涉及到前端页面数据的存储与读取,原本想使google的firebase,可是网址访问不了o(╥﹏╥)o,还好,有野狗. 野狗的"实时通信引擎"功能有效地解决了 ...

  8. 【数据结构】带头+双向+循环链表(增、删、查、改)的实现_【附源码、图片示例】_ [初阶篇_ 复习专用]

  9. Flask+mysql 实现增删改查接口开发+测试(图文教程附源码)

    目录 一.前言 二.环境准备 2.1 安装python 2.2 安装mysql 三.工具准备 3.1 安装pycharm 3.2 安装Navicat 3.3 安装postman 四.mysql数据库准 ...

最新文章

  1. R语言ggplot2可视化分面图(faceting)、并设置每一个分面中的条形图都是排序的(bars are in order in each per facet of facet_warp)
  2. 构造代码块,初始代码块和静态代码块的执行顺序
  3. SAP freelancer接SAP项目应有底线思维
  4. 写给 Android 应用工程师的 Binder 原理剖析
  5. 复现网状的记忆Transformer图像描述模型(失败)
  6. 使用NW.js封装微信公众号菜单编辑器为桌面应用
  7. 【无码专区4】幸运数字4(折半搜索+计数+结论)
  8. python80行代码写一个文件整理软件
  9. 前端 环形统计_用Canvas+js 实现简单圆形百分比统计图表
  10. 网络编程:TCP客户端的搭建流程(附源码)
  11. SaaS-HRM--第9章 文件上传与PDF报表入门
  12. php app 银联支付,php银联网页支付实现方法
  13. FPGA下载方式AS.PS,JTAG对比
  14. 逆向分析工具IDA与开源工具Ghidra、Cutter对比测评
  15. 【HGE】使用C++从加密压缩包中读取图像文件并显示
  16. DirextX 11游戏开发(1)
  17. 吕 思 伟 ---- 潘 爱 民 :: ATL 介 绍( 一) (转)
  18. 风火编程--opencv使用记事
  19. 今日金融词汇--- 商业模式
  20. PiMuseum-游戏开发入门级教程-中国象棋-Chapter-3

热门文章

  1. 屋顶材料/光伏板美标ASTM E108防火阻燃等级怎么分类
  2. 计算机科学丛书数据库系统,计算机科学丛书:数据库系统概念 读书笔记(十四)--事务(示例代码)...
  3. 【从零搭建后端基础设施系列(九)】-- VM容器化
  4. 商业模式新生代_免费商业模式——《商业模式新生代》读书笔记之五
  5. (12)梅森素数与完全数
  6. 这种木头比钢和陶瓷更锋利,轻松切开半熟牛排,钉穿三层木板,还永不生锈 | Cell子刊...
  7. synchronized锁升级之轻量级锁
  8. 3、基于注解的IoC装配与依赖注入
  9. 魔法师元素平衡(C++解法)
  10. 【神经网络参数初始化方法】