通讯录小项目(上)

Start And Stick

通讯录的实现有很多种方式,今天我们将用结构体实现简单的通讯录项目功能。包括通讯录的增、删、查、改等功能。

思路:

此次代码文件分别为:

文件名用途
sqlist.h用于函数和结构体的声明
sqlist.c用于函数的实现
test.c用于通讯录的测验
 

建立单个联系人的结构体:

对于单个联系人的数据内容,我们可以根据自己的喜好进行定义,这篇文章中我们将其包括联系人的::姓名、年龄、性别、电话。

 struct pereon
{char name[20];int age;char gender[2];char phone[13];
}

每一次利用该结构体时我们为了方便快捷,我们可以对结构体进行重命名:

这两种命名方式相等价,我们可以自由选择。


对于如何节省内存和提高代码机能:

创建单个联系人数据结构体后,我们就可以进行内存申请。但是为了节省内存,我们需要根据存储的联系人的多少进行申请。可是如果每增加一个联系人就重新申请一次内存就会降低代码的机能。

为此我们可以每次申请上一次申请内存空间的2倍。但是这样的话我们要什么时候申请内存空间呢?

为此我们可以在建立一个结构体,使其内部包含联系人的数量和我们我们申请内存空间最大可以储存的联系人的数量。当两者相等时我们就进行内存申请。


进行新的结构体建立:

这里我们利用numbers 表示存储联系人的个数,cp用表示可以储存最大联系人的个数。

到这里我们的准备工作就已经完毕了,接下来进行具体实现通讯录的函数实现。


通讯录的初始:

数据初始化:

//数据初始化
void SLinit(SL* p1)
{p1->a = NULL;p1->cp = p1->numbers = 0;
}

将创建的第一个数据结构的指针传入函数,对a的地址进行滞空,对cp和numbers的数据进行赋值0。这时我们已经有了通讯录的开始,接下来我们加入数据。


数据录入:

在每一次加入数据时我们要对联系人的姓名、年龄、性别、电话进行录入会很麻烦,这时我们可以将联系人的信息录入分装成一个函数:

//数据录入
PE inform()
{printf("请输入数据:");PE inof;printf("请输入name:");scanf("%s", inof.name);printf("请输入age:");scanf("%d", &inof.age);printf("请输入gender:");scanf("%s", inof.gender);printf("请输入phone number:");scanf("%s", inof.phone);return inof;
}

修改数据:

我们结构体通讯录数据的加入,是对WANG*a指向的内存空间的改变,同时对cp和numbers进行改变。也就是我们只需要创建一个SL类型的结构体就可以了,这与我们的链表通讯录有很大差异。

尾部插入数据:

//数据尾部插入
void SLdeposit(SL* p1)
{int mz = p1->cp == 0 ? 2 : 2 * p1->cp;if (p1->cp == p1->numbers) {p1->a = (WANG*)realloc(p1->a, mz * sizeof(WANG));p1->cp = mz;}assert(p1);p1->a[p1->numbers] = inform();p1->numbers++;
}

代码讲解:

这里我们需要注意这里的三目操作符的意思:如果cp的值为0则对mz赋值为2,否则对mz赋值为cp的2倍。

同时当我们的cp和numbers相等时对内存进行申请,之后将cp进行赋值。

在对数据进行录入后,将numbers进行增加。


查询数据:

我们查询数据的方式有很多种,例如联系人的姓名、年龄、电话等....。这里我们用姓名进行查询,在找到联系人后将数据进行打印,并返回联系人所占位置的下标。

int SLfind(SL*p1)
{assert(p1);printf("please write your name:");char name[20];scanf("%s", name);for (int i = 0; i < p1->numbers; i++){int m=strcmp(name, p1->a[i].name);if (m == 0)printf("%s %s %s %s\n", "姓名", "年龄", "性别", "电话");printf("%-s %-d %-s %-s\n",p1->a[i].name,p1->a[i].age,p1->a[i].gender,p1->a[i].phone);return i;}printf("查找失败\n");return -1;
}

代码讲解:

这里我们对名字进行比较时我们要利用字符串比较函数进行字符串比较,当两者相同时表示查找成功。

数据删除:

对数据进行删除,先要查询联系人数据,当存在该联系人数据时进行删除,同时将后面数据进行移动。

//数据删除
void SLdelete(SL* p1)
{assert(p1);int i = SLfind(p1);if(i>=0);{for (int m = i; m < p1->numbers-1; m++){p1->a[m] = p1->a[m + 1];}printf("删除成功\n");p1->numbers--;}if (i == -1) {printf("no people is this name\n");}
}

代码讲解:

这里我们也要注意一下,我们的数据下标和我们的numbers相差一(数组元素下标和元素的位置相差一)。

下期预告

到这里我们通讯录就有了一个基本的模型,下一篇文章我们将讲解通讯录的其它功能,并对其进行完善。

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

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

相关文章

DevOps系列文章之 Git命令:过滤日志

使用git log命令查找特定提交历史的高级技巧。其中的一些技巧配合格式化日志命令使用有奇效。 按照数量过滤 使用git log命令时最基本的过滤方式就是按照可以显示的日志条数进行过滤。如果你只对最近几次提交感兴趣&#xff0c;这会节省在页面上查看所有提交的麻烦。 git lo…

Vue3在css中使用v-bind绑定js/ts变量,也可以在scss和less中使用方式

主要介绍Vue3中的新增的v-bind()的常用使用方式&#xff0c;主要包括在css,less,scss中的使用&#xff0c;可以参考官方文档查看&#xff1a;Vue3官方文档 特别提醒 如果你想在scss中或者less中使用&#xff0c;可能会报各种乱七八糟的错误&#xff0c;最快最好用的方式就是单…

RBD —— 不同材质破碎

目录 Working with concrete Chipping Details Proxy geometry Constraints Working with glass Chipping Proxy geometry Constraints Resolving issues with glass fracturing Working with wood Clustering Using custom cutters Working with concrete Concr…

【RT-DETR有效改进】EfficientFormerV2移动设备优化的视觉网络(附对比试验效果图)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

THM学习笔记——john

John the Ripper是目前最好的哈希破解工具之一。 John基本语法&#xff1a; john [options] [path to file] john&#xff1a;调用John the Ripper程序。 [path to file]&#xff1a;包含你要尝试破解的哈希的文件&#xff0c;如果它们在同一个目录中&#xff0c;你就不需要命名…

理解虚拟内存

虚拟内存管理 分页管理 将用户程序的地址空间分为若干个固定大小的区域&#xff0c;称为“页面”。典型的页面大小为 1KB。相应地&#xff0c;也将内存空间分为若干个物理块&#xff0c;页和块的大小相同。然后通过映射表&#xff0c;把连续的虚拟内存空间&#xff0c;映射到离…

C++: 内联函数

目录 概念&#xff1a; 与宏的对比&#xff1a; 函数膨胀&#xff1a; 内联函数的特性&#xff1a; 概念&#xff1a; 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数…

Feign 体系架构解析

正所谓麻雀虽小五脏俱全&#xff0c;HTTP 调用看着简单&#xff0c;实则下面隐藏的是一套非常复杂的流程。 从上古时代 jspservlet&#xff0c;到后面的 SpringMVC&#xff0c;在 HTTP 请求解析和封装上同样是煞费苦心。 我们在学习中经常会碰到这种 case&#xff0c;有些开源…

阿里云一键部署搭建幻兽帕鲁联机服务器教程

幻兽帕鲁&#xff08;Palworld&#xff09;是一款多人在线游戏&#xff0c;为了获得更好的游戏体验&#xff0c;许多玩家会选择自行搭建游戏联机服务器&#xff0c;但是如何部署搭建幻兽帕鲁联机服务器成为一个难题&#xff0c;阿里云提供了一种高效且简便的一键部署方案&#…

qt初入门7:进度条,定时器,时间控件练习

参考课本demo&#xff0c;空闲时间练习一下进度条&#xff0c;定时器&#xff0c;日期相关控件和使用。 1&#xff1a;demo运行结果 2&#xff1a;进度条控件梳理 进度条显示控件实际上是QProgressBar, 显示的进度可以通过代码控制&#xff0c;也可以通过其他控件上获取到的值…

学习PyQt5

1、布局之后&#xff0c;无法移动对象到指定区域&#xff0c;无法改变对象大小。 原因&#xff1a;因为CtrlA选中了整个窗口&#xff0c;然后布局的时候就相当于整个窗口都按照这种布局&#xff0c;如选了水平布局&#xff0c;按钮一直在中间&#xff0c;无法拖到其它位置。 …

Unity之动画和角色控制

目录 &#x1f4d5; 一、动画 1.创建最简单的动画 2.动画控制器 &#x1f4d5;二、把动画和角色控制相结合 &#x1f4d5;三、实现实例 3.1 鼠标控制角色视角旋转 3.2 拖尾效果 &#x1f4d5;四、混合动画 最近学到动画了&#xff0c;顺便把之前创建的地形&#xff0…

go语言数组和切片

1. 数组Array Golang Array和以往认知的数组有很大不同。 1. 数组&#xff1a;是同一种数据类型的固定长度的序列。2. 数组定义&#xff1a;var a [len]int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且是类型的组成部分。一旦定义&…

Redis3-秒杀活动

秒杀 准备工作 我是参照下面这位大佬的i骄傲成下载的 csdn友情链接 Jmeter模拟多线程的压力测试工具 秒杀代码&#xff1a; package com.aaa.controller;import io.netty.util.internal.StringUtil; import org.apache.commons.lang.StringUtils; import org.springfram…

【大数据】详解 Flink 中的 WaterMark

详解 Flink 中的 WaterMark 1.基础概念1.1 流处理1.2 乱序1.3 窗口及其生命周期1.4 Keyed vs Non-Keyed1.5 Flink 中的时间 2.Watermark2.1 案例一2.2 案例二2.3 如何设置最大乱序时间2.4 延迟数据重定向 3.在 DDL 中的定义3.1 事件时间3.2 处理时间 1.基础概念 1.1 流处理 流…

深度推荐模型之DeepFM

一、FM 背景&#xff1a;主要解决大规模稀疏数据下的特征组合遇到的问题&#xff1a;1. 二阶特征参数数据呈指数增长 怎么做的&#xff1a;对每个特征引入大小为k的隐向量&#xff0c;两两特征的权重值通过计算对应特征的隐向量内积 而特征之间计算点积的复杂度原本为 实际应…

幻兽帕鲁的搭建和幻兽帕鲁需要什么配置的服务器

前言 大家好&#xff0c;今天教大家如何快速搭建幻兽帕鲁&#xff0c;并能满足8-32人游玩 第一步 购买服务器 1.CPU&#xff1a;4核&#xff08;最低需要4核起&#xff0c;当然可以选择更高的&#xff09;CPU的选择更看重单核性能&#xff0c;尽量选择主频2.5GHz以上的&#…

OpenTCS IDEA 全流程搭建和运行指南

OpenTCS IDEA 全流程搭建和运行指南 JDK安装下载JDK版本 openTCS源码下载IDEA 打开运行查看下载源码中gradle版本号下载gradle 二进制文件配置IDEA Gradle本地仓库IDEA打开openTCS项目运行顺序 JDK安装 下载JDK版本 JDK网址 注意&#xff1a; 请下载官方文档标准的java13JDK o…

4G模块Air724如何访问天气信息

1.这是获得json数据&#xff1a; 左边是标准官方api说明中的&#xff0c;右边是我用串口获取的&#xff1a; 2.首先找一个天气服务器&#xff0c;我的&#xff1a;YY天气&#xff0c;直接百度&#xff0c;注册&#xff0c;然后找api即可&#xff1a; 3.用接口工具测试接口是否…

AV Foundation 视频播放中的可视拖拽进度条

引言 在视频播放软件中&#xff0c;通过拖拽进度条来调整播放进度几乎已成为不可或缺的功能。这一功能使用户能够精确指定视频播放的时间点。近年来&#xff0c;视频播放器在原有的拖拽进度条基础上进行了更加人性化的性能提升&#xff0c;引入了可视化拖拽条。这一创新为用户…