通讯录中包含的内容:我们用结构体实现

typedef struct person{char name[32];char sex[8];int age;int number[16];char adress[64];
}person_t;typedef struct contact{//通讯录大小,保存了多少联系人以及联系人的信息(柔性数组)int cap;int size;person_t persons[0];
}contact_t;

通讯录首先要有一个菜单:

 void Menu(){printf("#  1.Add    2.Delet    #\n");printf("#  3.Find   4.Change #\n");printf("#  5.Show   6.Clear    #\n");printf("#  7.Sort   0.Exit     #\n");printf("请输入你的选择......");
}

通讯录的初始化:

void initContact(contact_t **ctp){*ctp = (contact_t*)malloc(sizeof(contact_t)+sizeof(person_t)*DFL_NUM);if (NULL == *ctp){perror("malloc");exit(1);}(*ctp)->cap = DFL_NUM;(*ctp)->size = 0;printf("default Contact init....done\n");
}

通讯录需要的操作:我们用一个个个的函数实现

由于添加联系人我们需要

1. 判断空间是否满了

2.空间满了的话开辟新的空间

3.判断要添加的联系人是否已经存在

4.输入联系人的各种信息等等

所以我们设计了相应的函数

判断空间是否已经满了(满了为真,不满为假)

//判断空间是否满了
int isFull(const contact_t *ct){return ct->cap == ct->size;
}

如果空间满了进行空间的扩容

 int Inc(contact_t **ctp){//空间的扩容contact_t *ct = (contact_t*)realloc(*ctp, sizeof(contact_t)+sizeof(person_t)*((*ctp)->cap + INC_NUM));if (ctp == NULL){//判断空间是否扩容成功perror("realloc");return 0;}ct->cap = (*ctp)->cap + INC_NUM;*ctp = ct;printf("扩容成功,cap:%d,size:%d\n", ct->cap, ct->size);return 1;}

判断联系人是否哦存在

 int FindPerson(const contact_t *ct, const char*name){const person_t*p = ct->persons;for (int i = 0; i < ct->size; i++){if (strcmp(p[i].name, name) == 0){return i;}}return -1;
}

1.添加联系人:


void AddPerson(contact_t **ctp){person_t *p = (*ctp)->persons;if (!isFull(*ctp) || Inc(ctp)){contact_t *ct = *ctp;person_t *p = ct->persons + ct->size;printf("请输入名字: \n");scanf("%s", p->name);if (FindPerson(*ctp, p->name) >= 0){printf("[%s]已经存在了\n", p->name);return;}printf("请输入这个人的性别\n");scanf("%s", p->sex);printf("请输入这个人的年龄\n");scanf("%d", &(p->age));printf("请输入这个人的电话\n");scanf("%s", p->number);printf("请输入你的地址\n");scanf("%s", p->adress);(ct->size)++;}
}

2.删除联系人

void DelPerson(contact_t *ct){char name[32] = { 0 };printf("请输入要删除人的姓名:\n");scanf("%s", name);for (int i = 0; i < ct->size; i++){if (strcmp(ct->persons[i].name, name) == 0){ct->persons[i] = ct->persons[ct->size];(ct->size)--;printf("删除成功!\n");return;}}printf("要删除的人不存在!\n");
}

3.查找联系人

void SearchPerson(const contact_t *ct){char name[32] = { 0 };printf("请输入查找人的姓名:\n");scanf("%s", name);for (int i = 0; i < ct->size; i++){if (strcmp(ct->persons[i].name, name) == 0){printf("| %10s | %4s | %3d | %8s | %8s |\n", ct->persons[i].name, ct->persons[i].sex, \ct->persons[i].age, ct->persons[i].number, ct->persons[i].adress);return;}}printf("I can't find he!\n");
}

4.更改联系人的某项信息

void ModPerson(contact_t *ct){char name[32] = { 0 };printf("请输入要更改人的姓名");scanf("%s", name);person_t *p = ct->persons;for (int i = 0; i < ct->size; i++){if (strcmp(ct->persons[i].name, name) == 0){int n = 0;printf("请选择要修改的信息:1.姓名 2.性别 3.年龄 4.电话号码 5.地址 \n");scanf("%d", &n);switch (n){case 1:printf("请输入姓名:\n");scanf("%s", p->name);break;case 2:printf("请输入性别:\n");scanf("%s", p->sex);break;case 3:printf("请输入年龄:\n");scanf("%d", &(p->age));break;case 4:printf("请输入电话号码:\n");scanf("%s", p->number);break;case 5:printf("请输入地址:\n");scanf("%s", p->adress);break;default:printf("你输入的有问题!\n");}}return;}printf("I can't find he!\n");}

5.显示整个通讯录

void PrintContact(contact_t *ct){for (int i = 0; i < ct->size; i++){printf("|%-10s|%-4s|%-3d|%8s|%8s|\n", ct->persons[i].name, \ct->persons[i].sex, ct->persons[i].age, \ct->persons[i].number, ct->persons[i].adress);}
}

6.清空整个通讯录

void ClearContact(contact_t*ct){//直接将size指向0printf("Clear...done\n");ct->size = 0;
}

7.按名字对通讯录进行排序

 int ComperName(const void *xp, const void *yp){const person_t *p = (const person_t*)xp;const person_t *q = (const person_t*)yp;return strcmp(p->name, q->name);
}void SortContact(contact_t *ct){//使用qsort函数进行排序qsort(ct->persons, ct->size, sizeof(person_t), ComperName);}

全部代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#pragma warning(disable:4996)
#define DFL_NUM 1
#define INC_NUM 1static void Menu(){printf("#  1.Add    2.Delet    #\n");printf("#  3.Find   4.Change #\n");printf("#  5.Show   6.Clear    #\n");printf("#  7.Sort   0.Exit     #\n");printf("请输入你的选择......");
}typedef struct person{char name[32];char sex[8];int age;int number[16];char adress[64];
}person_t;typedef struct contact{int cap;int size;person_t persons[0];
}contact_t;extern void Menu();
extern void initContact(contact_t **ctp);
extern void AddPerson(contact_t **ctp);
extern void DelPerson(contact_t *ct);
extern void SearchPerson(const contact_t *ct);
extern void ModPerson(contact_t *ct);
extern void PrintContact(contact_t *ct);
extern void ClearContact(contact_t*ct);
extern void SortContact(contact_t *ct);static int isFull(const contact_t *ct){return ct->cap == ct->size;
}static int Inc(contact_t **ctp){contact_t *ct = (contact_t*)realloc(*ctp, sizeof(contact_t)+sizeof(person_t)*((*ctp)->cap + INC_NUM));if (ctp == NULL){perror("realloc");return 0;}ct->cap =(*ctp)->cap + INC_NUM;*ctp = ct;printf("扩容成功,cap:%d,size:%d\n", ct->cap, ct->size);return 1;}static int FindPerson(const contact_t *ct, const char*name){const person_t*p = ct->persons;for (int i = 0; i < ct->size; i++){if (strcmp(p[i].name, name) == 0){return i;}}return -1;
}
static int ComperName(const void *xp, const void *yp){const person_t *p = (const person_t*)xp;const person_t *q = (const person_t*)yp;return strcmp(p->name, q->name);
}void SortContact(contact_t *ct){qsort(ct->persons, ct->size, sizeof(person_t), ComperName);}void ModPerson(contact_t *ct){char name[32] = { 0 };printf("请输入要更改人的姓名");scanf("%s", name);person_t *p = ct->persons;for (int i = 0; i < ct->size; i++){if (strcmp(ct->persons[i].name, name) == 0){int n = 0;           printf("请选择要修改的信息:1.姓名 2.性别 3.年龄 4.电话号码 5.地址 \n");scanf("%d", &n);switch (n){case 1:printf("请输入姓名:\n");scanf("%s", p->name);break;case 2:printf("请输入性别:\n");scanf("%s", p->sex);break;case 3:printf("请输入年龄:\n");scanf("%d", &(p->age));break;case 4:printf("请输入电话号码:\n");scanf("%s", p->number);break;case 5:printf("请输入地址:\n");scanf("%s", p->adress);break;default:printf("你输入的有问题!\n");}}return;}printf("I can't find he!\n");}
void DelPerson(contact_t *ct){char name[32] = { 0 };printf("请输入要删除人的姓名:\n");scanf("%s", name);for (int i = 0; i < ct->size; i++){if (strcmp(ct->persons[i].name, name) == 0){ct->persons[i] = ct->persons[ct->size];(ct->size)--;printf("删除成功!\n");return;}}printf("要删除的人不存在!\n");
}void SearchPerson(const contact_t *ct){char name[32] = {0};printf("请输入查找人的姓名:\n");scanf("%s", name);for (int i = 0; i < ct->size; i++){if (strcmp(ct->persons[i].name, name) == 0){printf("| %10s | %4s | %3d | %8s | %8s |\n", ct->persons[i].name, ct->persons[i].sex, \ct->persons[i].age, ct->persons[i].number, ct->persons[i].adress);return;}}printf("I can't find he!\n");
}void ClearContact(contact_t*ct){printf("Clear...done\n");ct->size = 0;
}void PrintContact(contact_t *ct){for (int i = 0; i < ct->size; i++){printf("|%-10s|%-4s|%-3d|%8s|%8s|\n", ct->persons[i].name, \ct->persons[i].sex, ct->persons[i].age, \ct->persons[i].number, ct->persons[i].adress);  }
}void initContact(contact_t **ctp){*ctp = (contact_t*)malloc(sizeof(contact_t)+sizeof(person_t)*DFL_NUM);if (NULL == *ctp){perror("malloc");exit(1);}(*ctp)->cap = DFL_NUM;(*ctp)->size = 0;printf("default Contact init....done\n");
}void AddPerson(contact_t **ctp){person_t *p = (*ctp)->persons;if (!isFull(*ctp)|| Inc(ctp)){contact_t *ct = *ctp;person_t *p = ct->persons+ct->size;printf("请输入名字: \n");scanf("%s", p->name);if (FindPerson(*ctp, p->name) >= 0){printf("[%s]已经存在了\n",p->name);return;}printf("请输入这个人的性别\n");scanf("%s", p->sex);printf("请输入这个人的年龄\n");scanf("%d", &(p->age));printf("请输入这个人的电话\n");scanf("%s", p->number);printf("请输入你的地址\n");scanf("%s", p->adress);(ct->size)++;}
}int main()
{contact_t *ct=NULL ;initContact(&ct);int n = 0;int quit = 0;while (!quit){Menu();scanf("%d", &n);switch (n){case 1:AddPerson(&ct);break;case 2:DelPerson(ct);break;case 3:SearchPerson(ct);break;case 4:ModPerson(ct);//bug!!break;case 5:PrintContact(ct);break;case 6:ClearContact(ct);break;case 7:SortContact(ct);break;case 0:quit = 1;break;default:printf("Error , Please Try Again!");}}printf("Bye bye !");system("pause");return 0;}

如果哪里有值得更正和完善的地方欢迎各位看官在评论区指正,我看到一定会尽己所能做到完善。如果觉得还可以,请赏作者一个免费的赞,谢谢你的阅读与指导。

教你用C语言实现简单的手机通讯录相关推荐

  1. 老司机教你用C语言制作简单实用的撩妹神器!

    你以为C语言就是提供一种编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言吗?你以为C语言就只是以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌 ...

  2. android 备份 通信录,如何简单备份手机通讯录?

    现在,很多小伙伴更换手机的速度很快,备份手机通讯录就变成经常性的工作了.备份通信录的办法有很多种.今天,小编就给大家介绍几种备份方法~ SIM卡备份 采用SIM卡备份和还原是最原始,也是最通用的备份方 ...

  3. C语言实现简单的电子通讯录2

    这两天学完系统调用和标准IO,之前的通讯录可以进行一些改进,将数据保存到文件中(图我这里就不发了). 原理:每次启动程序时先从预设文件中以只读的形式读取保存的通讯录信息,然后将读取到的信息导入到结构体 ...

  4. 自动发邮件的程序 c语言,5分钟!教你用C语言发送邮件:附送源码+教学!

    5分钟!教你用C语言发送邮件:附送源码+教学!-1.jpg (10.71 KB, 下载次数: 0) 2018-9-3 02:21 上传 关注<一碳科技>,获取更多知识! 前言 相信年夜家都 ...

  5. 手把手教你构建 C 语言编译器(8)- 表达式

    这是整个编译器的最后一部分,解析表达式.什么是表达式?表达式是将各种语言要素的一个组合,用来求值.例如:函数调用.变量赋值.运算符运算等等. 表达式的解析难点有二:一是运算符的优先级问题,二是如何将表 ...

  6. 手把手教你构建 C 语言编译器.参考.0 -- 前言

    手把手教你构建C语言编译器.参考.0 -- 前言 写在前面 简介 写在前面 在此,十分感谢 三点水 的学习分享手把手教你构建 C 语言编译器: https://lotabout.me/2015/wri ...

  7. 手把手教你构建 C 语言编译器(4)- 递归下降

    本章我们将讲解递归下降的方法,并用它完成一个基本的四则运算的语法分析器. 手把手教你构建 C 语言编译器系列共有10个部分: 手把手教你构建 C 语言编译器(0)--前言 手把手教你构建 C 语言编译 ...

  8. 老徐教你学C语言(C语言进门教程)

          都说C语言是所有语言的根基--得C语言者得天下,为了更好的方便初学者入门,特编辑了以下C语言进门教程--老徐教你学C语言,希望对初学者有所帮助   00.老徐教你学C语言--C语言学习之道 ...

  9. 手把手教你构建 C 语言编译器(3)- 词法分析器

    本章我们要讲解如何构建词法分析器. 手把手教你构建 C 语言编译器系列共有10个部分: 手把手教你构建 C 语言编译器(0)--前言 手把手教你构建 C 语言编译器(1)--设计 手把手教你构建 C ...

最新文章

  1. 【转】Winform输入法控制
  2. 从一致性hash到ceph crush算法演进图谱(持续更新)
  3. UA MATH567 高维统计I 概率不等式2 在Erdős–Rényi随机图模型中的应用
  4. 找到真爱了-sublime
  5. CSS3 :nth-child(n)使用注意
  6. 网络盘的计算机密码是什么情况,电脑e盘拒绝访问是什么原因?e盘加密方法
  7. 一季度平板电脑市场:苹果稳居第一,华为第二!
  8. 【OSG】安装编译小结
  9. shader 如何声明数组_聊聊如何正确向Compute Shader传递数组
  10. (超详细)搜索软件Everything的安装与使用
  11. ubuntu双系统 卸载+重装(ubuntu20.04)
  12. 中国网络游戏行业发展模式创新与投资前景调研报告2021-2027年
  13. win10怎么新建计算机用户,Win10添加用户教程(Microsoft微软帐户、本地帐户、儿童帐户)...
  14. LeetCode 347. 前 K 个高频元素(C++)*
  15. HDOJ 4069 Squiggly Sudoku 精确覆盖+搜索
  16. 综合布线可视化运维管理平台与电子配线架的区别
  17. 抽象工厂模式读书笔记
  18. 红米k40 刷面具后升级系统
  19. 自己动手写printf -- 库函数printf的实现
  20. java读取dat_Java批量解析微信dat文件

热门文章

  1. 调用百度文字识别接口实现文字识别
  2. 计算机操作系统回顾(一)(未知出处的PPT)记录
  3. 从贝叶斯理论到图像马尔科夫随机场
  4. 一光四电单模双纤以太网交换机,SC接口,25公里,DC12~58V。保证可与工业级光纤收发器配套使用
  5. MybatisPlus快速入门上手
  6. 三库(开发库、受控库、静态库)的概念和个人理解
  7. Android Studio 下载第三方库失败
  8. HTML5+CSS+JavaScript实现捉虫小游戏设计和实现【有密集恐惧症的别玩哟】
  9. Flink SQL:Queries(Windowing TVF)
  10. linux设置无密码登录