效果如图:

代码及详情如下:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>/*通讯录管理
问题描述:利用线性表实现一个通讯录管理。
要求:
1)实现通信录的建立、增加、删除、修改、查询等功能 ;
2) 能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作;
3) 能够保存每次更新的数据;
4) 编写main()函数测试操作的正确性。*/typedef struct people {//定义联系人结构体char name[20];//名字char tel[20];//电话
}P;
P num[100];//定义结构体数组,可以存100个联系人的信息
int i=0;//用于作联系人的序号,或者可以判断联系人个数是否到达了最大值//函数声明
void menu();
void add();
void del();
void find();
void edit();
void print();int main() {system("title 通讯录管理系统");int in;//选择值while (1) {menu();//菜单scanf("%d", &in);switch (in) {case 0:return;         //退出系统case 1:add(); break;  //添加联系人case 2:del(); break; //删除联系人case 3:find(); break;    //查找联系人case 4:edit(); break;    //编辑联系人case 5:print(); break;   //打印通讯录default:printf("输入错误,请重新输入:\n"); break;}}return 0;
}
//菜单
void menu() {printf("================================\n");printf("\t通讯录管理系统\n");printf("\t 0.退出通讯录\n");printf("\t 1.添加联系人\n");printf("\t 2.删除联系人\n");printf("\t 3.查找联系人\n");printf("\t 4.修改联系人\n");printf("\t 5.查看通讯录\n");printf("================================\n");printf("请选择:");
}
//与用户交互、显示输出的话语(我这里是将函数里的输出语句都写在了一个函数里,通过调用来显示,让函数显得整洁一点)
void Printf(double m) {if (m == 0) printf("该通讯录已经装满了!\n");if (m == 0.1) printf("当前没有联系人!\n");if (m == 1.1) printf("请输入联系人的姓名:\n");if (m == 1.2) printf("请输入联系人的电话:\n");if (m == 1.3) printf("添加成功!是否继续添加 Y/N:\n");if (m == 2.1) printf("请输入要删除的联系人姓名:\n");if (m == 2.2) printf("确认删除以下信息?\n");if (m == 2.3) printf("1.确认 2.返回\n");if (m == 2.4) printf("删除成功!\n");if (m == 2.5) printf("没有找到该联系人!\n");if (m == 3.1) printf("请输入要查找的联系人姓名:\n");if (m == 3.2) printf("查找成功!\n");if (m == 3.3) printf("经查无此人!\n");if (m == 4.1) printf("请输入要修改的联系人姓名:\n");if (m == 4.2) printf("当前联系人信息为:\n");if (m == 4.3) printf("是否确认修改?Y/N:\n");if (m == 4.4) printf("请输入新的姓名:\n");if (m == 4.5) printf("请输入新的电话:\n");if (m == 4.6) printf("修改成功!当前联系人信息为:\n");if (m == 4.7) printf("没有该联系人!\n");
}
//判断字符串是否相等,用于查询、删除、编辑等操作
int my_strcmp(char name[],int j) {  //接收输入的名字与该结构体数组下标char* p1 = name;             //strcmp参数是指针,所以将他们用指针表示char* p2 = (char*)&num[j];if (strcmp(p1, p2) == 0) {      //strcmp相等就返回0return 0;}return 1;
}
//打印单个人的信息,用于删除和编辑操作
void print2(int j) {printf("序号\t姓名\t\t电话\n");printf("%2d\t%s\t\t%s\n", (j+1),num[j].name, num[j].tel);
}
//1.增加联系人
void add() {if (i > 100) {                           //如果通讯录满了就不能在添加了Printf(0);                          //警告提示return;}char chose;                               //用于判断是否要继续添加while (1) {Printf(1.1);                        //提示输入名字scanf("%s", &num[i].name);getchar();                          //清除缓存区Printf(1.2);                     //提示输入电话scanf("%s", &num[i].tel);getchar();                           //清除缓冲区i++;                               //添加一个联系人就加一Printf(1.3);                        //提示是否继续添加scanf("%c", &chose);if (chose == 'y' || chose == 'Y') { //选择y或Y就继续添加,其他值退出continue;                      //结束本次循环,回到判断条件处}return;}
}
//删除的详细操作,将该联系人的信息变成后一个联系人,就算删除成功
void del2(int j) {for (j; j < i; j++) {num[j] = num[j + 1];}
}
//2.删除联系人
void del() {if (i == 0) {                         //判断当前是否有联系人Printf(0.1);return;}char name[20];                          //用来接收输入的要删除的联系人姓名int chose=0;                         //用作判断Printf(2.1);                          //删除的姓名scanf("%s", name);for (int j = 0; j < i; j++) {if (my_strcmp(name,j) == 0) {       //在数组里查找与输入名相同的元素Printf(2.2);                   //提示当前联系人信息print2(j);                       //显示当前的联系人信息Printf(2.3);                    //提示是否确认删除scanf("%d", &chose);if (chose == 1) {del2(j);                 //进行删除操作Printf(2.4);                //提示删除成功i--;                        //联系人的个数要减一return;                      }}}Printf(2.5);                         //没有找到目标,提示没有此人return;
}
//3.查找
void find() {if (i == 0) {                            //判断当前是否有联系人Printf(0.1);return;}Printf(3.1);                            //提示输入查找姓名char name[20];                            //接收姓名scanf("%s", name);for (int j = 0; j < i; j++) {if (my_strcmp(name,j) == 0) {        //查找与输入姓名相同的元素Printf(3.2);                  //提示找到了目标联系人print2(j);                      //显示该联系人的信息return;}}Printf(3.3);                            //提示没有找到联系人
}
//4.修改
void edit() {if (i == 0) {                            //判断当前是否有联系人Printf(0.1);return;}Printf(4.1);                            //输入编辑姓名char name[20];                          //接收姓名char chose;                               //用于选择scanf("%s", name);getchar();                                //清除缓存区for (int j = 0; j < i; j++) {if (my_strcmp(name, j) == 0) {      //查找与输入姓名相同的元素Printf(4.2);                  //提示找到此人print2(j);                      //输入此人信息Printf(4.3);                    //提示是否确认编辑scanf("%c", &chose);            //输入选择if (chose == 'y' || chose == 'Y') {Printf(4.4);               //提示输入新姓名scanf("%s", &num[j].name);   //输入新姓名Printf(4.5);             //提示输入新电话scanf("%s", &num[j].tel);    //输入新电话Printf(4.6);             //提示编辑成功print2(j);                  //显示新联系人信息return;}}}Printf(4.7);                            //提示没有此人
}
//5.显示通讯录
void print() {if (i == 0) {                           //判断当前是否有联系人Printf(0.1);return;}int j = 0;                             //作数组下标,从第一个元素开始输出printf("序号\t姓名\t\t电话\n");printf("----\t----\t\t----\n");for (j = 0; j < i; j++) {printf("%2d\t%s\t\t%s\n", (j + 1), num[j].name, num[j].tel);}
}

欢迎指出问题。

C语言结构体实现简单通讯录管理系统相关推荐

  1. 按平均成绩排行c语言文件操作,学生成绩管理系统(c语言结构体以及文件操作)实验报告精选.doc...

    学生成绩管理系统(c语言结构体以及文件操作)实验报告精选 C程序设计 实验报告 编号: 姓名院系学号任课教师于萧指导教师实验地点实验时间实验名称文件操作同 组 人无预习报告(对实验主要内容的认识)得分 ...

  2. c语言结构体编辑学生成绩管理,C语言基于结构体的学生信息管理系统实现

    宋福英 摘  要: 中国高校为保证学生信息安全,各分院的学生信息都在一个相对封闭的闭环内共享.中国高校在校生人数逐年递增,给高校的信息管理带来不小压力.C语言兼具高级语言和汇编语言的特点,简洁.紧凑. ...

  3. C语言结构体和结构体指针的简单用法

    C语言结构体和结构体指针的简单用法 这里总结一下自己的学习笔记,关于C语言当中的结构体指针的用法,以及结构体简单使用. 简单介绍一下今天出场的嘉宾–>结构体和结构体指针 什么是结构体: 1,定义 ...

  4. C语言结构体,超简单入门版!

    同学们好啊,我是401郭明,这篇博文我将带大家好好分析C语言结构体,帮大家在C语言方面快速打好基础,本篇博文主要针对没有C语言基础或者C语言基础不好的同学. 为了方便大家理解,我这篇文章将会讲的十分之 ...

  5. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

  6. c语言结构体教案,结构体——教学设计

    <结构体--教学设计>由会员分享,可在线阅读,更多相关<结构体--教学设计(7页珍藏版)>请在人人文库网上搜索. 1.课堂教学设计表章节名称结构体学科C语言程序设计授课班级大一 ...

  7. ARM汇编语言实现peek()_ARM汇编之访问C语言结构体数据

    前言 本文的写作目的在于装逼,没有要产生实际价值的意思. 前几天在做编译器的项目,有一个项目团队成员一直在问我ARM汇编能不能读C语言的结构体.我心想,我这生成ARM汇编的代码是用C++写的呀,又不是 ...

  8. C语言结构体-大小,对齐,填充,使用及其他

    C语言结构体-大小,对齐 C语言中的结构体(struct)的定义 在C语言中,最常用的数据结构就是结构体了,结构体也是其它数据结构(比如链表等)的基础,结构体的使用非常简单. 比如,定义一个结构体: ...

  9. 关于c语言结构体偏移的一点思考

    注:此处只是利用了编译器的特性来计算结构体偏移 这句话就一笔带过,说得有点牵强附会.以后有时间自己再详细了解一下编译器的特性... more exceptional c++ 中文版 26页 https ...

最新文章

  1. Web.config 灵活配置
  2. spoj Longest Common Substring II
  3. C++:13---多态和虚函数表
  4. CSS3(animation, trasfrom)总结
  5. 简单配置nginx使之支持pathinfo
  6. Windows8在激烈竞争的平板电脑市场的优势与特色---移动3G时代失落的windows开发人员的福音...
  7. android7.0 ActivityManagerService(AMS)启动流程
  8. Android技能树 — View小结
  9. Idea配置svn出现错误的解决方案
  10. iOS微信分享提示“未验证应用”的解决,配置 Universal Link
  11. python植物大战僵尸脚本_用Python实现植物大战僵尸游戏,很酷
  12. scroll-view实现下拉刷新(避免onload进入页面初始refresher-triggered为true触发下拉问题)
  13. [经验] 我想加入阿里,我该怎么做
  14. Pocket PC C#
  15. css实现动态渐变闪烁功能
  16. cPanel 开启 FastCGI
  17. 云终端和瘦客户机的区别
  18. 【youcans 的 OpenCV 例程200篇】123. 形态算法之孔洞填充
  19. 向量范数与矩阵范数定义和python向量矩阵运算示例
  20. JS 点击验证码刷新

热门文章

  1. 方德系统装exe文件_国产处理器+自主OS完美运行exe程序?英特尔认为有侵权嫌疑...
  2. 批量爬取上交所上市公司报告
  3. 太极图(JAVA实现)
  4. etal斜体吗 参考文献_参考文献方面毕业论文格式模板,与文下载****北京化工大学学报相关论文下载...
  5. C语音实现简单的密码登录(简单逻辑)
  6. win7 任务栏 通知区域
  7. 2018年中国光学镜头行业发展现状及发展趋势分析【图】
  8. linux脚本除号,Shell脚本编程(上)
  9. win10微软图标点击无反应_Win10系统点击无线图标没反应的解决方法
  10. CentOS7中使用kubeadm快速部署一套K8S集群