当前位置: 首页 > news >正文

顺序表第三节(通讯录基础版)

目录

可以先看一遍第二节在看这个         顺序表(第二节)实现和解析-CSDN博客

1.顺序表的头文件

2.初始化通讯录

3.添加通讯录

特殊:查找对应姓名的通讯录的序号 

4.删除通讯录

5.展示通讯录

6.查找通讯录

7.修改通讯录

8.销毁通讯录


可以先看一遍第二节在看这个         顺序表(第二节)实现和解析-CSDN博客

1.顺序表的头文件

#pragma once
#define NAME_MAX 100#define SEX_MAX 4#define TEL_MAX 11#define ADDR_MAX 100
//前置声明
typedef struct SeqList contact;
//用户数据
typedef struct PersonInfo{char name[NAME_MAX];char sex[SEX_MAX];char telenum[TEL_MAX];char adr[ADDR_MAX];
}PeoInfo;
//初始化通讯录
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);

 #pragma once 的意思是同一个头文件只能展开一次。

下面define几个变量。

第一个typedef 是把前面顺序表的结构体重命名为 contact。

第二个typedef 是把你通讯录的结构体类型重命名为 peoinfo。

下面则是每个方法的的接口名称。

2.初始化通讯录

void InitContact(contact* con)
{SLInit(con);
}

很简单调用前面的顺序表的初始化接口即可。 

3.添加通讯录

void AddContact(contact* con)
{PeoInfo info = {0};printf("请输入联系人姓名:\n");scanf("%s", info.name);printf("请输入联系人性别:\n");scanf("%s", info.sex);printf("请输入联系人电话号码:\n");scanf("%s", info.telenum);printf("请输入联系人地址:\n");scanf("%s", info.adr);SLPushBack(con, info);
}

让别人输入4个变量的值的过程,也很简单都是基础  !!!!!! 

特殊:查找对应姓名的通讯录的序号 

int FindByName(contact* con, char name[])
{for (int i = 0; i < con->size; i++){if (strcmp(con->a[i].name, name) == 0){return i;}}return -1;
}

这个函数作为中间函数,可以不用写在头文件里,但对于后面几步的操作确实必不可少的。

首先这个函数查找的是 用名字找位置(当然你也可以用其他的变量的值作为查找值)。

传入两个参数第一个是要查找的通讯录的指针,第二个则是要查找的姓名。

用遍历遍历每一个顺序表的表格中的内容,然后用strcmp函数来做比较,因为字符串比较用不了大小于符号。

strcmp的用法就是对比两个字符串如果都相等则返回0,如果不相等则返回不是0的数。

如果找到了就返回这个 i (这个 i 就是 相同名字在 通讯录的位置。)

找不到就返回-1. 

4.删除通讯录

void DelContact(contact* con)
{printf("请输入要删除的人的姓名:\n");char name[NAME_MAX];scanf("%s", name);int find = FindByName(con, name);if (find >= 0){SLErase(con, find);}else{printf("要删除的联系人不存在。\n");return;}
}

传入通讯录的指针。

然后让用户输入要查找的通讯录姓名,在用 int find 接收 函数返回值。

如果返回的是 i 那就是大于0 的,反之为-1 (上面特殊函数的返回值)。

如果大于0就代表找到了,利用顺序表删除的接口,删除这一格的通讯录信息。

反之就是没找到,打印没找到并返回。 

5.展示通讯录

void ShowContact(contact* con)
{printf("%-4s %-4s %-11s %s\n", "姓名", "性别", "号码", "地址");for (int i = 0; i < con->size; i++){printf("%-4s %-4s %-11s %s\n", con->a[i].name, con->a[i].sex, con->a[i].telenum, con->a[i].adr);}}

展示通讯录就是把通讯录的内容打印出来即可。先做好表头就是把内容都打印好。
然后再用for循环给通讯录的内容一一遍历并打印出来即可。

6.查找通讯录

void FindContact(contact* con)
{char name[NAME_MAX];printf("你要查找的姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("你输入的姓名不存在!\n");return;}printf("%-4s %-4s %-11s %s\n", "姓名", "性别", "号码", "地址");printf("%-4s %-4s %-11s %s\n", con->a[find].name, con->a[find].sex, con->a[find].telenum, con->a[find].adr);
}

查找通讯录和删除的前提都是一样的,都是用 findbyname 函数找到对应位置的通讯录。

然后找到了就打印出这一格的通讯录内容即可。 

7.修改通讯录

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->a[find].name);printf("请输入修改后的性别:\n");scanf("%s", con->a[find].sex);printf("请输入修改后的电话:\n");scanf("%s", con->a[find].telenum);printf("请输入修改后的地址:\n");scanf("%s", con->a[find].adr);
}

更改联系人,和上面也一样先用到 findbyname 接口。

然后在对通讯录里的内容进行更改就好。 

8.销毁通讯录

void DestroyContact(contact* con)
{SLDestory(con);
}

销毁通讯录,就用到顺序表的销毁接口就好了。总之通讯录的实现是很快的。 

 9.优化界面(超简易版)

#include"sql.h"
#include"txl.h"
void menu()
{printf("***********************************\n");printf("*****1.添加联系人 2.删除联系人*****\n");printf("*****3.查找联系人 4.查看联系人*****\n");printf("*****5.修改联系人 0.退出通讯录*****\n");printf("***********************************\n");
}
int main()
{contact con;InitContact(&con);int num = 0;do{menu();printf("输入操作数:\n");scanf("%d", &num);switch (num){case 1:AddContact(&con);break;case 2:DelContact(&con);break;case 3:FindContact(&con);break;case 4:ShowContact(&con);break;case 5:ModifyContact(&con);break;case 0:printf("退出!\n");break;default:printf("输入的操作不存在!请重新输入\n");break;}} while (num);DestroyContact(&con);return 0;
}

 最终结果:

相关文章:

顺序表第三节(通讯录基础版)

目录 可以先看一遍第二节在看这个 顺序表&#xff08;第二节&#xff09;实现和解析-CSDN博客 1.顺序表的头文件 2.初始化通讯录 3.添加通讯录 特殊&#xff1a;查找对应姓名的通讯录的序号 4.删除通讯录 5.展示通讯录 6.查找通讯录 7.修改通讯录 8.销毁通讯…...

数字ID和字符串ID互相转化

对于想隐藏真实id的需求&#xff0c;比如想加密userId等 使用示例&#xff1a; * 不指定长度* AlphaIDCustom(12354&#xff09;&#xff1b; //会将数字转换为字母。* AlphaIDCustom(PpQXn7COf,true&#xff09;&#xff1b;//会将字母ID转换为对应的数字。* 指定长度* Alpha…...

「Qt中文教程指南」如何创建基于Qt Widget的应用程序(三)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文描述了如何使用…...

Django CSRF Bypass

自存用 Django CSRF Bypass (CVE-2016-7401) 漏洞分析...

微信小程序 —— 会议OA项目首页布局与Mock数据交互

14天阅读挑战赛如果世界上有奇迹&#xff0c;那一定是努力的另一个名字。 目录 一、小程序布局 1.1 Flex布局 1.2 Flex属性 二、OA会议首页搭建 2.1 首页底部菜单 2.2 创建后端结口 2.3 Mock模拟数据 2.4 首页轮播图搭建 2.5 首页内容搭建 一、小程序布局 1.1 Flex布…...

机器学习-K-近邻(KNN)算法

目录 一 . K-近邻算法&#xff08;KNN&#xff09;概述 二、KNN算法实现 三、 MATLAB实现 四、 实战 一 . K-近邻算法&#xff08;KNN&#xff09;概述 K-近邻算法&#xff08;KNN&#xff09;是一种基本的分类算法&#xff0c;它通过计算数据点之间的距离来进行分类。在…...

shell_38.Linux读取脚本名

读取脚本名 (1)示例 $ cat positional0.sh #!/bin/bash # Handling the $0 command-line parameter # echo This script name is $0. exit $ $ bash positional0.sh This script name is positional0.sh. $ (2)如果使用另一个命令来运行 shell 脚本&#xff0c;则命令…...

面试题-React(十七):如何使用RTK进行状态管理

Redux Toolkit&#xff08;RTK&#xff09; 是一个强大的工具集&#xff0c;旨在简化和改进Redux的使用。它提供了一组工具和约定&#xff0c;使Redux的配置和编写更加直观和高效。 一、Redux Toolkit简介 Redux Toolkit是一个由Redux官方团队开发和维护的库&#xff0c;旨在…...

网络安全—自学笔记

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类…...

Java后端开发(五)-- 对象转换工具类

为避免返回给前端的字段信息太多,在缓解前、后端通信的带宽压力的前提下,对不必要的字段的信息进行不返回时,entity层对象需要向vo层对象进行转换,同事尽量减少geetter与setter方法的编码。 1. ConvertUtils工具类 import org.slf4j.Logger; import org.slf4j.LoggerFacto…...

pandas写入MySQL

安装好pandas、mysql pip install pandas pip install pymysql 导入pandas、mysql import pymysql as mysql import pandas as pd 建立连接 conmysql.connect(host10.10.0.221,userroot,passwordroot,databasepandas,port3306,charsetutf8) 创建游标 curcon.cursor() 读…...

TCP实战:即时通信-端口转发

1、即时通信是什么含义&#xff0c;要实现怎么样的设计&#xff1f; 即时通信&#xff0c;是指一个客户端的消息发出去&#xff0c;其他客户端可以接收到即时通信需要进行端口转发的设计思想服务端需要把在线的Socket管道存储起来一旦收到一个消息要推送给其他管道 服务端 pac…...

CMakeLists.txt详解

CMakeLists.txt详解 CMakeLists.txt是一个用于构建C/C项目的CMake配置文件。它定义了项目的编译选项&#xff0c;包括编译器类型、依赖库、预处理宏和子目录等。让我们逐步解析这个文件。 编译器检测 CMAKE_CXX_COMPILER_ID 变量用于检测编译器类型。在这个示例中&#xff0…...

记一个JSON返回数据的bug

记一个JSON返回数据的bug:‘Object of type int64 is not JSON serializable’ 我在打包数组进行json数据返回时&#xff0c;有一个参数是numpy数组里计算出来的&#xff0c;类型为int64&#xff0c;直接进行json打包会报错 提示(‘Object of type int64 is not JSON serializa…...

毫米波雷达模块技术革新:在自动驾驶汽车中的前沿应用

随着自动驾驶技术的快速发展&#xff0c;毫米波雷达模块的技术革新成为推动这一领域的关键因素之一。本文将深入研究毫米波雷达模块技术的最新进展&#xff0c;并探讨其在自动驾驶汽车中的前沿应用。 毫米波雷达模块的基本原理 解释毫米波雷达模块的基本工作原理&#xff0c;强…...

优秀数据库模式迁移工具的发展历程

数据库模式迁移可能是应用程序开发中风险最大的领域——因为这是一个困难的、有风险的和痛苦的过程。数据库模式迁移工具的存在是为了减轻这种痛苦&#xff0c;并且已经取得了长足的进步&#xff1a;从基本的CLI工具到GUI工具&#xff0c;从简单的SQL GUI客户端到一体化协作数据…...

【深度学习】数据集最常见的问题及其解决方案

简介 如果您还没有听过&#xff0c;请告诉您一个事实&#xff0c;作为一名数据科学家&#xff0c;您应该始终站在一个角落跟你说&#xff1a;“你的结果与你的数据一样好。” 尝试通过提高模型能力来弥补糟糕的数据是许多人会犯的错误。这相当于你因为原来的汽车使用了劣质汽…...

Excel文件带有密码的只读模式,如何设置?

Excel带有密码的除了打开密码和工作表保护以外&#xff0c;其实还有一种可以设置密码的方法&#xff0c;今天给大家分享如何设置带有密码的只读模式。 打开excel文件&#xff0c;将文件进行【另存为】设置&#xff0c;然后停留在保存路径的界面中&#xff0c;我们点击下面的工…...

【Qt之json文件】json文件介绍及相关读写类介绍、示例

JSON介绍 JSON&#xff08;JavaScript Object Notation&#xff09;是一种源自Javascript的编码对象数据的轻量级的数据交换格式&#xff0c;易于理解和编写&#xff0c;JSON但现在已广泛用作互联网上的数据交换格式。 Qt提供了处理JSON数据的支持。Qt中的JSON支持提供了一个易…...

arp 隔离

目录 问题查找解决方式参考 问题 linux 在使用双网卡系统时&#xff0c;当这两个不同网段的网口接到同一个交换机上&#xff0c;会出现 eth0 的 arp 请求&#xff0c;会在 eth1 上收到并回复&#xff0c;相当于自己检测到了自己的 ip。 查找 linux 的底层&#xff0c;默认情…...

FLUX.1-Krea-Extracted-LoRA教程:如何用‘high-end commercial’触发专业感

FLUX.1-Krea-Extracted-LoRA教程&#xff1a;如何用high-end commercial触发专业感 1. 模型介绍 FLUX.1-Krea-Extracted-LoRA 是一款专为真实感图像生成设计的模型&#xff0c;基于 FLUX.1-dev 基础模型开发。这个模型通过特殊的 LoRA 风格权重&#xff0c;能够显著提升生成图…...

C++26合约机制深度剖析(ISO/IEC TS 21425:2025正式采纳版独家解读)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;C26合约机制的标准化演进与核心定位 C26 正式将合约&#xff08;Contracts&#xff09;纳入核心语言特性&#xff0c;标志着其从 C20 的技术规范草案&#xff08;TS&#xff09;走向稳定、可移植的标准…...

你的软件授权还在用Key文件?试试这个‘硬件锁+离线心跳’双保险方案,防破解更安心

硬件锁与离线心跳&#xff1a;高价值软件的双重授权防护体系 在工业设计软件、金融分析系统等专业工具领域&#xff0c;一套价值数万元的软件被非法复制可能意味着数百万的直接损失。传统的Key文件授权方式早已被破解者摸透规律——内存调试、反编译、密钥提取等手段让软件厂商…...

RISC-V特权架构探秘:从模式切换看系统安全与效率

1. RISC-V特权架构的核心价值 第一次接触RISC-V特权架构时&#xff0c;很多人会疑惑&#xff1a;为什么需要设计这么多层特权模式&#xff1f;这就像城市交通管理中的红绿灯系统——如果没有分层权限控制&#xff0c;所有程序都能随意访问硬件资源&#xff0c;就像所有车辆都能…...

梯度下降法:从数学原理到机器学习优化实践

1. 梯度下降法入门&#xff1a;从数学原理到机器学习实践梯度下降法是优化领域中最为核心的算法之一&#xff0c;也是机器学习工程师工具箱中的必备武器。我第一次接触这个概念是在研究生时期的数值分析课上&#xff0c;当时教授在黑板上画出一个山谷的剖面图&#xff0c;然后让…...

别再手动拖拽了!用Polyworks脚本实现点云与CAD模型的自动化粗对齐(附完整代码)

解锁Polyworks脚本潜能&#xff1a;点云与CAD模型的智能对齐实战指南 在三维测量与逆向工程领域&#xff0c;点云数据与CAD模型的对齐是每个工程师都无法绕开的必经之路。传统的手动对齐方式不仅耗时费力&#xff0c;还容易因人为因素引入误差。想象一下&#xff0c;当你面对数…...

git下载与安装教程

Git下载与安装教程 一、下载Git 访问官网 打开Git官方网站下载&#xff1a;Git - Install &#xff08;注&#xff1a;官网界面可能更新&#xff0c;核心下载区域位置不变&#xff09; 选择系统版本 Windows用户&#xff1a;点击"Download for Windows"按钮macOS用…...

VSCode嵌入式配置必须关闭的4个默认设置!否则导致Flash烧录失败、SWD通信超时、变量值显示为<optimized out>(附修复前后性能对比数据)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VSCode嵌入式开发配置的致命陷阱与修复必要性 在嵌入式开发中&#xff0c;VSCode 因其轻量、可扩展和跨平台特性被广泛采用&#xff0c;但默认配置极易埋下隐蔽却破坏性的陷阱——最典型的是调试器路径…...

让ChatGPT看懂心电图?手把手教你用TEST方法对齐时间序列与文本嵌入

医疗时间序列智能分析实战&#xff1a;TEST方法在ECG诊断中的落地指南 当心电监护仪的波形曲线在屏幕上跳动时&#xff0c;医生需要数十年经验才能捕捉到的细微异常&#xff0c;能否被AI准确识别并转化为可解释的医疗建议&#xff1f;这不仅是技术问题&#xff0c;更关乎生命健…...

首涂第45套模板_苹果CMSv10仿爱奇艺模板

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 首涂第45套模板/苹果CMSv10仿爱奇艺模板 使用说明&#xff1a; 上传到苹果CMS根目录的/template里边解压 到后台自定义菜单添加 快捷菜单 shoutu_45,/template/shoutu45/admin/adm.php 注意去修改/p…...