通讯录小项目(上)

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相差一(数组元素下标和元素的位置相差一)。

下期预告

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JaveWeb教程】(38)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(11)过滤器Filter讲解

目录 SpringBootWeb案例10 过滤器Filter2.4 过滤器Filter2.4.1 快速入门2.4.2 Filter详解2.4.2.1 执行流程2.4.2.2 拦截路径2.4.2.3 过滤器链 2.4.3 登录校验-Filter2.4.3.1 分析2.4.3.2 具体流程2.4.3.3 代码实现 SpringBootWeb案例10 过滤器Filter 2.4 过滤器Filter 刚才通…

VBA技术资料MF111:将表对象转换为正常范围

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

大数据期望最大化(EM)算法:从理论到实战全解析

文章目录 大数据期望最大化&#xff08;EM&#xff09;算法&#xff1a;从理论到实战全解析一、引言概率模型与隐变量极大似然估计&#xff08;MLE&#xff09;Jensen不等式 二、基础数学原理条件概率与联合概率似然函数Kullback-Leibler散度贝叶斯推断 三、EM算法的核心思想期…

【JAVA】提交任务时,线程池队列已满,这时会发生什么

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 抛出异常&#xff1a; 阻塞等待&#xff1a; 丢弃任务&#xff1a; 调整线程池参数&#xff1a; 使用拒绝策略&#xff1a; 结…

数字图像处理(实践篇)二十七 Python-OpenCV 滑动条的使用

目录 1 涉及的函数 2 实践 1 涉及的函数 ⒈ setWindowProperty()用于设置GUI应用程序的属性 cv2.setWindowProperty(windowsName, prop_id, prop_value) 参数: ①

张维迎《博弈与社会》笔记(4)导论:社会最优与帕累托标准

本节我们将从社会的角度来评判人类行为&#xff1a;一个社会应该采取什么样的标准来判断个人行为&#xff1f;具体地讲&#xff0c;我们需要知道&#xff0c;从社会的角度来评判&#xff0c;什么样的行为是正当的&#xff0c;什么样的行为是不正当的&#xff1b;什么样的行为应…

小电影网站上线之nginx配置不带www域名301重定向到www域名+接入腾讯云安全防护edgeone

背景 写了个电影网站&#xff08;纯粹搞着玩的&#xff09;&#xff0c;准备买个域名然后上线&#xff0c;但是看日志经常被一些恶意IP进行攻击&#xff0c;这里准备接入腾讯云的安全以及加速产品edgeone&#xff0c;记录下当时的步骤。 一、nginx配置重定向以及日志格式 ng…

C++ 隐式转换构造函数和explicit 关键字学习

据说在内核代码中,多个地方使用了explicit 关键字;下面看一下; 在 C++ 中,隐式转换构造函数指的是当我们将一种类型的值赋给该类对象时,编译器会自动调用相应的构造函数进行类型转换。这样可以使得不同类型之间能够互相赋值或者传参。 具体来说,当一个类有多个构造函数…

【归并排序】【图论】【动态规划】【 深度游戏搜索】1569将子数组重新排序得到同一个二叉搜索树的方案数

本文涉及知识点 动态规划汇总 图论 深度游戏搜索 归并排序 组合 LeetCoce1569将子数组重新排序得到同一个二叉搜索树的方案数 给你一个数组 nums 表示 1 到 n 的一个排列。我们按照元素在 nums 中的顺序依次插入一个初始为空的二叉搜索树&#xff08;BST&#xff09;。请你统…

瑞萨RL78G12系列单片机使用IAR软件进行仿真设置及与E2接线

目录 一、单片机与仿真器连接 二、IAR软件在线仿真使用手册 一、单片机与仿真器连接 E1引脚接线图 RL78系列单片机的GND接仿真器的pin2、pin12、pin14 RL78系列单片机的VDD接仿真器的pin8 RL78系列单片机的Tool0接仿真器的pin5 RL78系列单片机的Reset接仿真器的pin10、pin…

【计算机网络】深入掌握计算机网络的核心要点

写在前面 前言四层模型网络地址管理Linux下设置ipARP请求包总结 前言 计算机网络是指将分散的计算机设备通过通信线路连接起来&#xff0c;形成一个统一的网络。为了使得各个计算机之间能够相互通信&#xff0c;需要遵循一定的协议和规范。OSI参考模型和TCP/IP参考模型是计算机…

免费SSL数字证书申请,免费数字证书使用教程

为什么要使用SSL数字证书&#xff1f; 1. 数据加密&#xff08;SSL数字证书通过使用加密算法对传输的数据进行加密&#xff0c;保证数据在传输过程中不被篡改。&#xff09; 2. 使用了SSL数字证书&#xff0c;浏览器中不会显示不安全&#xff0c;小程序开通&#xff0c;给你的…

Java基础知识-异常

资料来自黑马程序员 异常 异常&#xff0c;就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是&#xff1a; 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;…

Pandas.DataFrame.mode() 众数 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 …

34.基于51单片机的智能停车位计时收费系统设计

一、系统功能介绍&#xff1a; 本设计基于 RFID智能识别和高速的视频图像和存储比较相结合&#xff0c;通过计算机的图像处理和自动识别&#xff0c;对车辆进出停车场的收费、车牌识别和车位诱导等&#xff0c;以实现停车场全方位智能管理。 本设计是以AT89C51 型单片机为主控芯…

flutter-相关个人记录

1、flutter 安卓打包打包报错 flutter build apk -v --no-tree-shake-icons 2、获取华为指纹证书命令 keytool -list -v -keystore ***.jks 3、IOS项目中私有方法查找隐藏文件中 1、cd 项目目录地址 2、grep -r xerbla. "xerbla"为需要查找的关键字 3…

docker容器运维命令

文章目录 docker psdocker execdocker inspectdocker topdocker attachdocker waitdocker exportdocker importdocker portdocker cpdocker diffdocker renamedocker statsdocker update总结 docker ps 列出容器。 docker ps [OPTIONS]OPTIONS说明&#xff1a; -a :显示所有的…

【嵌入式学习】C++QT-Day3-C++基础

笔记 见我的博客&#xff1a;https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函…

HarmonyOS鸿蒙学习笔记(23)监听Wifi状态变化

监听Wifi状态变化 前言创建接收状态变化的Bean对象创建订阅者和订阅事件参考资料&#xff1a; 前言 本篇博文通过动态订阅公共事件来说明怎么使用HarmonyOS监听Wifi状态的变化。关于动态订阅公共事件的概念&#xff0c;官网有详细说明&#xff0c;再次就不在赘述。博文相关项目…