顺序表第三节(通讯录基础版)
目录
可以先看一遍第二节在看这个 顺序表(第二节)实现和解析-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;
}
最终结果:
相关文章:
顺序表第三节(通讯录基础版)
目录 可以先看一遍第二节在看这个 顺序表(第二节)实现和解析-CSDN博客 1.顺序表的头文件 2.初始化通讯录 3.添加通讯录 特殊:查找对应姓名的通讯录的序号 4.删除通讯录 5.展示通讯录 6.查找通讯录 7.修改通讯录 8.销毁通讯…...
数字ID和字符串ID互相转化
对于想隐藏真实id的需求,比如想加密userId等 使用示例: * 不指定长度* AlphaIDCustom(12354); //会将数字转换为字母。* AlphaIDCustom(PpQXn7COf,true);//会将字母ID转换为对应的数字。* 指定长度* Alpha…...
「Qt中文教程指南」如何创建基于Qt Widget的应用程序(三)
Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文描述了如何使用…...
Django CSRF Bypass
自存用 Django CSRF Bypass (CVE-2016-7401) 漏洞分析...
微信小程序 —— 会议OA项目首页布局与Mock数据交互
14天阅读挑战赛如果世界上有奇迹,那一定是努力的另一个名字。 目录 一、小程序布局 1.1 Flex布局 1.2 Flex属性 二、OA会议首页搭建 2.1 首页底部菜单 2.2 创建后端结口 2.3 Mock模拟数据 2.4 首页轮播图搭建 2.5 首页内容搭建 一、小程序布局 1.1 Flex布…...
机器学习-K-近邻(KNN)算法
目录 一 . K-近邻算法(KNN)概述 二、KNN算法实现 三、 MATLAB实现 四、 实战 一 . K-近邻算法(KNN)概述 K-近邻算法(KNN)是一种基本的分类算法,它通过计算数据点之间的距离来进行分类。在…...
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 脚本,则命令…...
面试题-React(十七):如何使用RTK进行状态管理
Redux Toolkit(RTK) 是一个强大的工具集,旨在简化和改进Redux的使用。它提供了一组工具和约定,使Redux的配置和编写更加直观和高效。 一、Redux Toolkit简介 Redux Toolkit是一个由Redux官方团队开发和维护的库,旨在…...
网络安全—自学笔记
目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类…...
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、即时通信是什么含义,要实现怎么样的设计? 即时通信,是指一个客户端的消息发出去,其他客户端可以接收到即时通信需要进行端口转发的设计思想服务端需要把在线的Socket管道存储起来一旦收到一个消息要推送给其他管道 服务端 pac…...
CMakeLists.txt详解
CMakeLists.txt详解 CMakeLists.txt是一个用于构建C/C项目的CMake配置文件。它定义了项目的编译选项,包括编译器类型、依赖库、预处理宏和子目录等。让我们逐步解析这个文件。 编译器检测 CMAKE_CXX_COMPILER_ID 变量用于检测编译器类型。在这个示例中࿰…...
记一个JSON返回数据的bug
记一个JSON返回数据的bug:‘Object of type int64 is not JSON serializable’ 我在打包数组进行json数据返回时,有一个参数是numpy数组里计算出来的,类型为int64,直接进行json打包会报错 提示(‘Object of type int64 is not JSON serializa…...
毫米波雷达模块技术革新:在自动驾驶汽车中的前沿应用
随着自动驾驶技术的快速发展,毫米波雷达模块的技术革新成为推动这一领域的关键因素之一。本文将深入研究毫米波雷达模块技术的最新进展,并探讨其在自动驾驶汽车中的前沿应用。 毫米波雷达模块的基本原理 解释毫米波雷达模块的基本工作原理,强…...
优秀数据库模式迁移工具的发展历程
数据库模式迁移可能是应用程序开发中风险最大的领域——因为这是一个困难的、有风险的和痛苦的过程。数据库模式迁移工具的存在是为了减轻这种痛苦,并且已经取得了长足的进步:从基本的CLI工具到GUI工具,从简单的SQL GUI客户端到一体化协作数据…...
【深度学习】数据集最常见的问题及其解决方案
简介 如果您还没有听过,请告诉您一个事实,作为一名数据科学家,您应该始终站在一个角落跟你说:“你的结果与你的数据一样好。” 尝试通过提高模型能力来弥补糟糕的数据是许多人会犯的错误。这相当于你因为原来的汽车使用了劣质汽…...
Excel文件带有密码的只读模式,如何设置?
Excel带有密码的除了打开密码和工作表保护以外,其实还有一种可以设置密码的方法,今天给大家分享如何设置带有密码的只读模式。 打开excel文件,将文件进行【另存为】设置,然后停留在保存路径的界面中,我们点击下面的工…...
【Qt之json文件】json文件介绍及相关读写类介绍、示例
JSON介绍 JSON(JavaScript Object Notation)是一种源自Javascript的编码对象数据的轻量级的数据交换格式,易于理解和编写,JSON但现在已广泛用作互联网上的数据交换格式。 Qt提供了处理JSON数据的支持。Qt中的JSON支持提供了一个易…...
arp 隔离
目录 问题查找解决方式参考 问题 linux 在使用双网卡系统时,当这两个不同网段的网口接到同一个交换机上,会出现 eth0 的 arp 请求,会在 eth1 上收到并回复,相当于自己检测到了自己的 ip。 查找 linux 的底层,默认情…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
