效果如图:

代码及详情如下:


#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. android常见错误与问题
  2. linux vi修改后如何保存
  3. HAProxy高并发问题解决
  4. 【JeeSite】用户管理
  5. 重写Checkbox 改写选择框的大小
  6. 自动化部署脚本开启所有zookpeer等服务
  7. java中timer类包_Java~util包中Timer的使用, 演示cancel方法 和 对比schedule和scheduleAtFixedRate方法...
  8. Unity导入3D模型的过程与方法
  9. 刚走上管理岗位的人要怎么做?
  10. MySQL索引的原理,B+树、聚集索引和二级索引的结构分析
  11. mybatis分页插件 pagehelper点击末页跳到第8页
  12. switchhost,更方便的管理host
  13. python 在线ide搭建_从头开始制作OJ-在线IDE的搭建
  14. 互联网企业实习面试经验分享(谷歌微软hulu阿里腾讯字节美团百度等等)
  15. 解决1KB文件夹快捷方式病毒
  16. [NOIP2015普及组]推销员
  17. SpringSecurity-12-PasswordEncoder密码加密简介
  18. ultravnc 设置代理_云立方IP丨IP代理可以实现哪些功能?
  19. 【Android 系统】--- 下载 Android源码
  20. ker矩阵是什么意思_矩阵形式下的最小二乘法推导

热门文章

  1. 2021年北京高新技术企业认定补贴及政策要求
  2. 杨立昆最新访谈:AI威胁论是蒙昧主义,控制欲只有人才有 (全文+视频)
  3. 笛卡尔的思维法则(数学思维的规范)
  4. [精简]什么是和弦?
  5. 如何取消Chrome浏览器自动翻译
  6. 成功的路上会布满荆棘
  7. 幂律分布(python)
  8. java计算机毕业设计红色景点自驾游网站管理系统MyBatis+系统+LW文档+源码+调试部署
  9. 如何成为一名卓越的软件工程师
  10. 2018年9月网易游戏雷火防护工程师秋招线下笔试