用结构体实现通讯录
迪丽瓦拉
2025-05-31 20:53:37
0

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🌸通讯录的需求

通讯录的功能

🐰 通讯录的原码

🌸主函数

🌸头文件

🌸函数实现文件


🌸通讯录的需求

1.人员的姓名

2.人员的年龄

3.人员的性别

4.人员的电话号码

5.人员的地址

实现方法:通讯录初始设置100个人的空间,开辟100个人的空间,创建100个人的结构体数组。我们设置两个结构体,一个保存通讯录的需求,一个保存结构体结构体数组和通讯录的人数。

注意:通讯录初始的存储值是100(结构体数组有100成员),就是说可以存储100个人的信息,有效个数也是从0开始的(pc->sz最开始为0)

通讯录的功能

初始化通讯录:

void InitContact(Contact* pc)
{pc->sz=0;memset(pc->data,0,sizeof(pc->data));
}

pc->data结构体首元素的地址,sizeof(pc->data)计算的是整个结构体数组的大小,然后用memeset将整个数组初始化为0,别忘了引用头文件#include

增加联系人:

void AddContact(Contact* pc);

每个联系人都包含姓名,年龄,性别,电话号码,地址,我们需要一一录入,录入成功后,将有效个数(就是联系人个数)增加一,pc->sz增加一

展示联系人的信息:

void ShowContact(Contact* pc);

 就是打印出,通讯录里存在的联系人的所有信息,使用的是循环语句。

删除指定人信息

void DelContact(Contact* pc);

就是我们输入我们想要的查找人的名字,如果通讯录里存在这个人,我就删除这个人的信息。这里实现了一个查找姓名的函数,因为在改变联系人信息功能里也需要实现查找这个功能,所以实现一个函数,减少代码的重叠性。

int Find_name(Contact* pc,char name[])

如果在查找函数中,找到这个人的姓名,我们将返回这个人在结构体数组的位置,就是pc->sz。找到了之后,我们会让后面一个人的信息复制到前一个人的空间里,从要删的人位置开始,直到通讯录要删的人位置以后的人都向前复制了。这样我们就删除指定人的信息。

查找指定人的信息

void SearchContact(Contact* pc);

我们还是需要Find_name这个函数去帮我们找到我想修改人员的名字,返回这个人在结构体的位置(pc->sz),找到之后打印这个人的信息。

改变指定人信息

void ModifyContact(Contact* pc);

 我们还是需要Find_name这个函数去帮我们找到我想修改人员的名字,返回这个人在结构体的位置(pc->sz),找到之后直接通过他的位置修改这个人的信息。

给通讯录的人信息排序

void SortContact(Contact* pc,int op);

排序我们使用的系统的自带的qsort给通讯录人员信息进行排序,qsort的原型

qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_name);

qrort函数第一个参数是排序空间的首地址,第二个参数是排序的个数,第三个参数是排序单个元素的大小,第四个元素是排序函数。

我们这里排序有两种选择,一是按照姓名排序,而是按照年龄排序,所以有两个排序函数

int cmp_by_name(const void* e1,const void* e2)//按照姓名排序
{return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
}int cmp_by_gae(const void* e1,const void* e2)//按照年龄排序
{return ((PeoInfo*)e1)->age-((PeoInfo*)e2)->age;
}

🐰 通讯录的原码

🌸主函数

#include"test.h"
void menu(void)
{printf("===========================\n");printf("        1.添加,2.删除       \n");printf("        3.查找,4.改动       \n");printf("        5.展示,6.排序       \n");printf("        0.退出             \n");printf("===========================\n");
}
enum Option
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT,
};
int main()
{Contact con;InitContact(&con);int input=0;int op=0;do{menu();printf("请选择\n");scanf("%d",&input);switch(input){case ADD:AddContact(&con);break;case DEL:DelContact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:printf("请选择排序方法\n");printf("=========================\n");printf("1.按名字排序     2.按年龄排序\n");printf("=========================\n");scanf("%d",&op);SortContact(&con,op);break;case EXIT:printf("退出通讯录\n");break;default:printf("输入错误\n");break;}}while(input);
}

🌸头文件

#ifndef test_h
#define test_h
#include 
#endif /* test_h */#include
#include#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
typedef struct PeoInfo
{char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_ADDR];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];//存放数据int sz;//有效信息的个数
}Contact;//初始化
void InitContact(Contact* pc);
//增加指定联系人
void AddContact(Contact* pc);
//展示联系人的信息
void ShowContact(Contact* pc);
//删除指定人信息
void DelContact(Contact* pc);
//查找指定人的信息
void SearchContact(Contact* pc);
//改变指定人信息
void ModifyContact(Contact* pc);
//给通讯录的人信息排序
void SortContact(Contact* pc,int op);

🌸函数实现文件

#include "test.h"
void InitContact(Contact* pc)
{pc->sz=0;memset(pc->data,0,sizeof(pc->data));
}
void AddContact(Contact* pc)
{if(pc->sz==MAX){printf("通讯录已满,无法增加\n");}else{printf("请输入名字\n");scanf("%s",pc->data[pc->sz].name);printf("请输入年龄\n");scanf("%d",&(pc->data[pc->sz].age));printf("请输入性别\n");scanf("%s",pc->data[pc->sz].sex);printf("请输入电话号码\n");scanf("%s",pc->data[pc->sz].tele);printf("请输入地址\n");scanf("%s",pc->data[pc->sz].addr);}pc->sz++;printf("添加成功\n");
}
void ShowContact(Contact* pc)
{printf("%-10s %-4s %-5s %-12s %-30s\n","性别","年龄","性别","电话号码","地址");for(int i=0;isz;i++){printf("%-10s %-4d %-5s %-12s %-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}
int Find_name(Contact* pc,char name[])
{int i;int pos=-1;for( i=0;isz;i++){if(strcmp(name,pc->data[i].name)==0){pos=i;break;}}return pos;
}
void DelContact(Contact* pc)
{if(pc->sz==0){printf("通讯录为空,无法删除\n");}//删除//1.找到删除人的位置char name[MAX_NAME];int pos=-1;int i;printf("输入删除人的名字;>\n");scanf("%s",name);pos=Find_name(pc,name);if(pos==-1){printf("要删的人不存在\n");}else{for(i=pos;isz-1;i++){pc->data[i]=pc->data[i+1];}pc->sz--;printf("删除成功\n");}
}
void SearchContact(Contact* pc)
{char name[MAX_NAME];printf("输入查找人的名字;>\n");scanf("%s",name);int pos=-1;pos=Find_name(pc, name);if(pos==-1){printf("查找的人不存在\n");}else{printf("%-10s %-4s %-5s %-12s %-30s\n","性别","年龄","性别","电话号码","地址");printf("%-10s %-4d %-5s %-12s %-30s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}
void ModifyContact(Contact* pc)
{char name[MAX_NAME];printf("输入修改人的名字;>\n");scanf("%s",name);int pos=-1;pos=Find_name(pc, name);if(pos==-1){printf("修改人信息不存在\n");}else{printf("请输入名字\n");scanf("%s",pc->data[pos].name);printf("请输入年龄\n");scanf("%d",&(pc->data[pos].age));printf("请输入性别\n");scanf("%s",pc->data[pos].sex);printf("请输入电话号码\n");scanf("%s",pc->data[pos].tele);printf("请输入地址\n");scanf("%s",pc->data[pos].addr);printf("修改成功\n");}
}
int cmp_by_name(const void* e1,const void* e2)
{return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
}
int cmp_by_gae(const void* e1,const void* e2)
{return ((PeoInfo*)e1)->age-((PeoInfo*)e2)->age;
}
void SortContact(Contact* pc,int op)
{if(op==1){qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_name);printf("排序成功\n");}if(op==2){qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_gae);printf("排序成功\n");}
}

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 ​​​​​​​ 

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...