通讯录小项目(上)

news2025/1/18 11:03:54

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.coloradmin.cn/o/1416484.html

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

相关文章

【数据结构四】栈与Stack详解

目录 栈与Stack 1.实现一个自己的栈 2.Stack的基本使用 3.栈的一些oj题训练 4.栈&#xff0c;虚拟机栈&#xff0c;栈帧的区别 栈与Stack 栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶…

Java集合总览

1.总览 Java中的集合分List、Set、Queue、Map 4种类型。 List&#xff1a;大多数实现元素可以为null&#xff0c;可重复&#xff0c;底层是数组或链表的结构&#xff0c;支持动态扩容 Set&#xff1a;大多数实现元素可以为null但只能是1个&#xff0c;不能重复&#xff0c; …

LeetCode(1)

目录 时间复杂度分析&#xff1a; 递归 题1&#xff1a;爬楼梯 解法1&#xff1a;递归 解法2&#xff1a;循环 题2&#xff1a;两数之和 解法1&#xff1a;暴力枚举 解法2&#xff1a; 哈希表 题3&#xff1a;合并两个有序数组 解法1&#xff1a;直接合并后排序 解法2&…

华为机考入门python3--(0)模拟题3-计算字符串重新排列数

分类&#xff1a;排列组合 知识点&#xff1a; 计算字符串中每个字符出现的次数 Counter(string) 计算列表中每个元素出现的次数 Counter(list) 阶乘 math.factorial(num) 排列去重 题目来自【华为招聘模拟考试】 先把每个字符当成唯一出现过一次&#xff0c;计算所有排列…

Linux文本三剑客---awk经典案例

awk&#xff08;是一种处理文本文件的应用程序&#xff0c;它依次处理文件的每一行&#xff0c;并读取里面的每一个字段。&#xff09; awk 包含几个特殊的内建变量&#xff08;可直接用&#xff09;如下所示&#xff1a; 1、获取根分区剩余大小 #可以使用df -h命令来查看所有…

详解顺序结构双指针处理算法

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

如何在Ubuntu安装配置SVN服务端并实现无公网ip访问内网资料库

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改au…

swift - reduce简介

reduce 减少&#xff0c;降低&#xff1b;&#xff08;烹调中&#xff09;使变浓稠&#xff0c;收汁&#xff1b;<美>节食减肥&#xff1b;使沦为&#xff0c;使陷入&#xff08;不好的境地&#xff09;&#xff1b;迫使&#xff0c;使不得不&#xff08;做&#xff09;&…

【C++】输入输出、缺省参数、函数重载

目录 C的输入和输出 缺省参数 概念 缺省参数的分类 全缺省参数 半缺省参数 函数重载 概念 C支持函数重载的原理--名字修饰 C的输入和输出 #include<iostream> // std是C标准库的命名空间名&#xff0c;C将标准库的定义实现都放到这个命名空间中 using namespace …

BKP备份寄存器、RTC实时时钟

目录 1. BKP (Backup Registers)备份寄存器 2. RTC (Real Time Clock)实时时钟 1. BKP (Backup Registers)备份寄存器 BKP可用于存储用户应用程序数据。当VDD (2.0-3.6V)电源被切断,他们仍然由VBAT (1.8-3.6V)维持供电。当系统在待机模式下被唤醒&#xff0c;或系统复位或…

【大数据】Flink 架构(一):系统架构

Flink 架构&#xff08;一&#xff09;&#xff1a;系统架构 1.Flink 组件1.1 JobManager1.2 ResourceManager1.3 TaskManager1.4 Dispatcher 2.应用部署2.1 框架模式2.2 库模式 3.任务执行4.高可用设置4.1 TaskManager 故障4.2 JobManager 故障 Flink 是一个用于状态化并行流处…

BeanUtils和BeanCopier性能复制Bean工具比较

文章目录 一、前言二、实验三、原理1、BeanUtils2、BeanCopier 四、总结 一、前言 我们本篇比较的是复制Bean对象的工具&#xff0c;分别是org.springframework.beans.BeanUtils和 net.sf.cglib.beans.BeanCopier 二、实验 import net.sf.cglib.beans.BeanCopier; import org…

部署LNMP、Nginx+FastCGI、Nginx地址重写语法,地址重写应用案例

1 案例1&#xff1a;部署LNMP环境 1.1 问题 安装部署LNMP环境实现动态网站解析 静态网站 在不同环境下访问&#xff0c;网站内容不会变化 动态网站 在不同环境下访问&#xff0c;网站内容有可能发生变化 安装部署Nginx、MariaDB、PHP、PHP-FPM&#xff1b;启动Nginx、Mari…

java—AWT

AWT 课程&#xff1a;1、GUI编程简介_哔哩哔哩_bilibili 一.介绍 包含了很多类和接口&#xff01;GUI&#xff01;元素&#xff1a;窗口、按钮、文本框java.awt 二.窗口 1.构造 2.方法 // 实例化frame类Frame frame new Frame("这个一个框");// 设置可见性frame.…

游戏设计模式

单列模式 概念 单例模式是一种创建型设计模式&#xff0c;可以保证一个类只有一个实例&#xff0c;并提供一个访问该实例的全局节点。 优点 可以派生&#xff1a;在单例类的实例构造函数中可以设置以允许子类派生。受控访问&#xff1a;因为单例类封装他的唯一实例&#xf…

Cyberdog2 docker环境软件源无法被验证问题

搭建docker系统后更新软件源sudo apt-get update出现异常 经过查询GPT&#xff0c;使用如下方式成功解决 从keyserver.ubuntu.com获取缺失的公钥&#xff0c;并添加到apt-key中。具体命令如下&#xff1a; gpg --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C6…

C++的关键字,命名空间,缺省参数,函数重载以及原理

文章目录 前言一、C关键字(C98)二、命名空间命名空间介绍命名空间的使用 三、C输入【cin】& 输出【cout】四、缺省参数缺省参数概念缺省参数分类缺省参数的使用小结一下 五、函数重载函数重载介绍函数重载类型 六、C支持函数重载的原理--名字修饰(name Mangling)【重点】 前…

【开源】基于JAVA语言的智慧社区业务综合平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预约业务模块2.4 反馈管理模块2.5 社区新闻模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 业务类型表3.2.2 基础业务表3.2.3 预约业务表3.2.4 反馈表3.2.5 社区新闻表 四、系统展…

[BUUCTF]-PWN:hitcon2014_stkof解析

又是一道堆题&#xff0c;先看保护 关键信息&#xff0c;64位&#xff0c;没开pie。再看ida 大致就是alloc创建堆块&#xff0c;free释放堆块&#xff0c;fill填充堆块内容&#xff0c;以及一个看起来没啥用的函数&#xff0c;当然我也没利用这个函数去解题 这里有两种解法 解…

Python tkinter (6) Listbox

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 GUI 目录 Listbox 创建listbox 添加元素…