顺序表的应用之通讯录专题

顺序表的应用 

1.基于动态顺序表实现通讯录:

C语言基础要求:

结构体,动态内存管理,顺序表,文件操作

1.功能要求

1)至少能够存储100个人的通讯信息
2)能够保存用户信息:名字、性别、年龄、电话、地址等
3)增加联系人信息
4)删除指定联系人
5)查找制定联系人
6)修改指定联系人
7)显示联系人信息
2、代码实现
【思考1】用静态顺序表和动态顺序表分别如何实现
思考2】如何保证程序结束后,历史通讯录信息不会丢失

下面的两传代码包括讲解与实现细节多多

contact.h
#pragma once
//顺序表一开始存储的是内置类型,现在我要存储的是自定义类型,而这个自定义类型就是联系人数据
//定义联系人数据结构
//包括:姓名 性别 年龄 电话 地址#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100
//前置声明
//给顺序表改个名字叫做通讯录,但是为什么不是typedef SL contact;呢?因为这里我们没有包含顺序表的头文件,我就找不到SL,所以这里我们就要用到结构体的初始名字 
typedef struct SeqList contact;
//用户数据
typedef struct personinfo//因为我每次使用这个联系人结构体都要用struct personinfo,这样就特别的麻烦,所以我们写个名字就可以
{char name[NAME_MAX];char gender[SEX_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];}peoInfo;//因为结构体要存到顺序表中,所以我们要对顺序表里存储的数据类型做替换
//所以SeqList.h这个文件里的typedef int SLDataType;要替换成typedef peoInfo SLDataType;//要用到顺序表相关方法,对通讯录的操作实际上就是对顺序表进行操作
// 讯录相关的方法     //初始化通讯录
void InitContact(contact* con);
//添加通讯录数据
void AddContact(contact* con);
//删除通讯录数据
void DelContact(contact* con);
//展示通讯录数据
void ShowContact(contact* con); 
//查找通讯录数据
void FindContact(contact* con);
//修改通讯录数据
void ModifyContact(contact* con);
//销毁通讯录数据
void DestroyContact(contact* con);
contact.c
#include"contact.h"
#include"SeqList.h"
//通讯录的初始化
void InitContact(contact* con)
{//通讯录的初始化实际上进行的是顺序表的初始化。//而且顺序表的初始化已经实现好了,我们就直接调用就可以了SLInit(con);
}
//顺序表的销毁
void DestroyContact(contact* con)
{SLDestroy(con);//跟上面的是同理的
}
//通讯录添加数据
void AddContact(contact* con)
{
//我们要添加数据,获取用户输入的内容:姓名+性别+年龄+电话+地址  我们要思考一个问题?这些姓名性别电话年龄地址要保存到哪里呢?//因为我们前面定义好联系人数据结构体了,就是这个:/*typedef struct personinfo{char name[NAME_MAX];char sex[SEX_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];}peoInfo;*///接下来我们就直接用这个结构体就行了:peoInfo info;//现在这个结构体里面没有任何数据我获取到的任何数据都需要往这个结构体里面去插入printf("请输入要添加的联系人姓名:\n");scanf("%s",info.name);printf("请输入要添加的联系人性别:\n");scanf("%s", info.gender);printf("请输入要添加的联系年龄:\n");//为什么单单这个年龄要加取地址符号?因为name gender tel addr都是数组名他们本身就是地址scanf("%s", &info.age);printf("请输入要添加的联系人电话:\n");scanf("%s", info.tel);printf("请输入要添加的联系人地址:\n");scanf("%s", info.addr);//接下来我们要往通讯录中添加联系人数据,通讯录就是顺序表,我们有头插尾插指定位置插入数据,这几个都可以进行,这里我们选用尾插void SLPushBack(con, info);//尾插有两个参数一个是通讯录,一个就是我们要插入的数据,这里的数据类型是SLDataType x,是 peoInfo结构体类型,//刚好我们这里定义了结构体我们把数据都保存到了结构体里面,所以这第二个参数我们就写入info就行了。//void SLPushBack(con, info);叫做顺序表中已有方法的复用
}int FindByName(contact* con, char name[]);//根据姓名查找,我们要往通讯录里查,这里提供一个通讯录 contact* con
{
//下面我就用for循环来进行遍历for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].name, name))//这里的name是字符串我们就要用strcmp进行比较大小{//找到了return i;}}//没有找到return -1;
}
void DelContact(contact* con)
{//要删除的数据必须要存在才能执行删除操作,那要看这个数据在不在就要进行查找,那我们就在姓名进行查找,我们把查找写到上面char name[NAME_MAX];printf("请输入你要查找的联系人的数据:\n");scanf("%s", name);//接下来我要调用上面的函数查找联系人在不在int find = FindByName(con, name);if (find < 0){printf("要删除的联系人数据不存在!\n");return ;}//要删除的联系人数据存在//接下来我们就要删除联系人数据,有头删尾删指定数据删除,我们要用的就是指定数据的删除SLErase(con, find);printf("删除成功\n"); 
}
//展示通讯录数据
void ShowContact(contact* con)
{//表头:姓名 性别 年龄 电话 地址printf("%s %s %s %s %s\n", "姓名","性别","年龄","电话""地址");//遍历通讯录,按照格式打印每个联系人数据for (int i = 0; i < con->size; i++){printf("%3s %3s %3d %3s %3s\n", con->arr[i].name, con->arr[i].gender, con->arr[i].age, con->arr[i].tel, con->arr[i].addr);}
}
//通讯录的修改
void ModifyContact(contact* con)
{void ModifyContact(contact * con) {char name[NAME_MAX];printf("请输入要修改的用户姓名:\n");scanf("%s", name);int find = FindByName(con, name);//修改之前还是要查看一下联系人是否存在if (find < 0) {printf("要修改的联系人数据不存在!\n");return;}}//直接修改printf("请输入要修改的姓名 \n");scanf("%s", con->arr[find].name);printf("请输入要修改的性别 \n");scanf("%s", con->arr[find].sgender);printf("请输入要修改的年龄\n");scanf("%d", &con->arr[find].age);printf(" 请输入要修改的电话\n");scanf("%s", con->arr[find].tel);printf("请输入要修改的地址 \n");scanf("%s", con->arr[find].addr);printf("修改成功 \n");
}
//通讯录的查找
void FindContact(contact* con)
{//通讯录的查找应该是这样的我打出11这个姓名要把它的所有信息都打印出来。
//	11   11    11    11   11char name[NAME_MAX]int find = FindByName(con, name);if (find < 0){printf("要删除的联系人数据不存在!\n");return;}//我们查找找出来的话,是按照这个样子打印的//姓名 性别 年龄 电话 地址//11    11   11   11   11
//所以我们要把上面展示数据的代码拿下来printf("%s %s %s %s %s\n", "姓名","性别","年龄","电话""地址");printf("%3s %3s %3d %3s %3s\n", con->arr[find].name, con->arr[find].gender, con->arr[find].age, con->arr[find].tel,con->arr[find].addr);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FastAPI 学习之路(四十七)WebSockets(三)登录后才可以聊天

之前我们是通过前端自动生成的token信息&#xff0c;这次我们通过注册登录&#xff0c;保存到本地去实现。首先&#xff0c;我们实现一个登录页面&#xff0c;放在templates目录下。 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

PHP单商户微店b2c商城微信小程序系统源码

打造专属线上购物空间&#x1f6cd;️ &#x1f680;【开篇&#xff1a;解锁新零售时代新风尚】&#x1f680; 在这个数字化飞速发展的时代&#xff0c;线上购物已成为我们日常生活不可或缺的一部分。对于单商户而言&#xff0c;拥有一个专属的B2C商城微信小程序&#xff0c;…

SHAP(SHapley Additive exPlanations)算法

SHAP&#xff08;SHapley Additive exPlanations&#xff09;算法是一种用于解释机器学习模型的方法&#xff0c;它基于博弈论中的 Shapley 值。 Shapley 值原本用于解决合作博弈中参与者对总收益贡献的分配问题。SHAP 算法将每个特征值对模型输出的贡献视为一种“公平”的分配…

【番外】Springboot集成推荐配置及十问RocketMQ

文章目录 Springboot推荐配置方式十问1. 为什么springboot系统集成只有一个producer&#xff0c;并集成到RocketMQTemplate里面&#xff1f;2. 为什么consumer必须要再额外使用一个MessageListener来处理消息&#xff1f;3. 一个系统只用一个producer和consumer可不可行&#x…

非堆成加密SM2算法java实现

基于SM2算法的Java示例代码&#xff0c;展示了如何进行公钥加密、私钥解密、私钥签名和公钥验签。 非堆成加密公私钥使用学习请查看&#xff1a;非堆成加密公私钥使用-CSDN博客 RSA算法&#xff1a;非堆成加密RSA算法java实现-CSDN博客 代码示例 展示了以下步骤&#xff1a…

Xcode打包与发布全攻略:将你的应用带上App Store

标题&#xff1a;Xcode打包与发布全攻略&#xff1a;将你的应用带上App Store 在应用开发旅程的最后阶段&#xff0c;打包和发布流程是将应用呈现给用户的关键步骤。Xcode&#xff0c;作为iOS和macOS应用开发的官方工具&#xff0c;提供了一套完整的打包和发布机制。本文将详细…

图形化编程题库:Scratch图形化编程1~4真题及答案汇总

图形化编程题库全面覆盖Scratch编程学习&#xff0c;精心整理了从基础到进阶的1~4级真题及详尽答案汇总。无论您是Scratch编程初学者还是寻求提升的练习者&#xff0c;这里都能找到丰富的练习题资源&#xff0c;助力您通过实战加深理解&#xff0c;掌握图形化编程的精髓与技巧。…

Centos7 yum 报错「Errno 256」No more mirrors to try 解决方法

解决方案大致有三种 一、更新yum 二、若不行&#xff0c;可能是因为DNS不稳定吧&#xff0c;因为yum安装时会从三个”repo源“&#xff08;base&#xff0c;extras&#xff0c;updates&#xff09;随机获取地址 三、分析总结法 背景 我使用yum方式安装软件时&#xff0c;比…

在Qt C++项目中调用7z API实现压缩和解压

文章目录 在Qt C++项目中调用7z API实现压缩和解压前置条件步骤一:配置7z库下载7z源码编译7z库步骤二:在Qt项目中集成7z库创建Qt项目配置.pro文件添加7z头文件步骤三:实现压缩功能创建压缩函数调用压缩函数步骤四:实现解压功能创建解压函数调用解压函数结论参考Win11下编译…

如何高效去除论文中的AI痕迹?AI助手在此,为你指点迷津

试试这四款AI论文工具和降重技术&#xff01; 在科研领域&#xff0c;AI写作工具如同新一代的科研利器&#xff0c;它们能够极大提高文献查阅、思路整理和表达优化的效率&#xff0c;本质上促进了科研工作的进步。AI写作工具不仅快速获取并整理海量信息&#xff0c;还帮助我们…

C++心决之stl中那些你不知道的秘密(string篇)

目录 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的操作 3.vs和g下string结构的说明 3. string类的模拟实现 3.2 浅拷贝 3.3 深拷贝 3.4 写…

基于springboot的鲜花管理系统

系统文档需要联系&#xff0c;白嫖勿扰

四大内网穿透利器对比

本文精选四款市场上的佼佼者——巴比达、花生壳、Frp及NatApp&#xff0c;详细剖析它们的特点与优势&#xff0c;助力企业和个人用户精准选择&#xff0c;其中特别强调了巴比达在企业级安全访问方面的突出贡献。 1. 巴比达 特点 深度安全防护&#xff1a;巴比达提供全方位安…

软设模式之状态模式

设计模式中状态模式的意图是&#xff1a;允许一个对象在其内部状态被改变时改变它的行为 打个比方&#xff0c;在一款即时战略游戏中设计一辆坦克&#xff0c;坦克有普通攻击状态&#xff0c;还有一防空状态。通过设计一个坦克抽象父类&#xff0c;再在下面设计一个具体坦克子…

一文带你入门机器学习超参数优化算法

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强调的是,专栏仅介绍主…

程序员的自我约束炼成记

自我约束&#xff0c;是一个人能否走向成功的关键&#xff0c;不知道你是否同意&#xff1f;搞编程10几年了&#xff0c;从来不觉得有什么了不起的&#xff0c;但可以不断自我更新&#xff0c;学习新技术&#xff0c;自我约束力起了很大的作用&#xff0c;对我而言&#xff0c;…

“南征北战”| 卓翼飞思技术领航,助力人工智能大赛上海赛区选拔赛圆满落幕

卓翼飞思继6月支持辽宁赛区选拔赛圆满收官后&#xff0c;近日再次技术助力&#xff0c;为上海赛区的比赛画上圆满句号。值得一提的是&#xff0c;在此次比赛中来自上海工程技术大学、同济大学、上海商学院、上海农林职业技术学院&#xff0c;使用卓翼飞思设备的5支参赛队伍&…

Monaco 使用 DefinitionProvider

DefinitionProvider 可以弹出方法定义&#xff0c;效果如下&#xff0c;按住 command 鼠标左键&#xff0c;弹出方法说明。 点击时 Monaco Editor 会调用注册函数&#xff0c;注册函数返回文件地址和需要显示的位置&#xff0c;实现代码如下 return monaco.languages.register…

参与开源项目的经验和收获

关于当前开源项目的发展趋势&#xff0c;我认为有以下几个显著的特点&#xff1a; 快速增长的参与度和社区规模&#xff1a;随着全球化和互联网的普及&#xff0c;开源项目的参与度和社区规模在快速增长。无论是大型企业还是个人开发者&#xff0c;都越来越倾向于参与开源项目…

#if defined(WEBRTC_USE_H264) webrtc.a的宏机制

#ifndef是 if not define的缩写,#ifdef 是 if define 的缩写。 define有两种,一种是单纯宏定义,一种是定义宏为特定值。 #define WEBRTC_USE_H264#defined WEBRTC_USE_H264 11.1定义值用作预处理: #define A 0