通讯录项目—顺序表实现

     在上次我介绍顺序表后相信大家对顺序表有了一定的了解,现在就让我们来练练如何用它,这篇是在顺序表基础上新增的(建议看看线性表—顺序表实现-CSDN博客)。

目录

通讯录简介

创建用户信息

适配和理解通讯录

功能实现

初始化通讯录

销毁通讯录

增加用户信息

删除指定用户信息

查找用户信息

修改用户信息

显示用户信息

全代码

Contact.h

Contact.c


通讯录简介

     下面是通讯录要实现的功能。

  1. 能够保存用户信息:名字、性别、年龄、电话、地址等。
  2. 增加用户信息。
  3. 删除指定用户信息。
  4. 查找用户信息。
  5. 修改用户信息。
  6. 显示用户信息。

创建用户信息

     在创建用户信息前依然是要创建两个项目Contact.h,Contact.c用来存放新增的代码。

     用户信息里包含名字,性别,年龄,电话,地址等这需要用结构体来定义。我把结构体给重命名为penInfo。数组的大小我把它定义为了常量(方便后期更改)。

#define NAME_MAX 20
#define GEMDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100

typedef struct personInfo
{
	char name[NAME_MAX];//名字
	char gender[GEMDER_MAX];//性别
	int age;//年龄
	char tel[TEL_MAX];//电话
	char addr[ADDR_MAX];//地址
}peoInfo;

typedef struct SeqList Contact;

     大家可能注意到了这段代码的最后一行有这么一段话typedef struct SeqList Contact,有什么用呢?

     我会在下面的适配和理解通讯录中详解。

适配和理解通讯录

     之前顺序表的arr是指向int类型的指针,但现在它需要指向结构体。还记得为什么要创造SLDataType吗?它是用来表示arr的类型。所以只要把int换成penInfo就可以了  (这里要把Contact.h放在SeqList.h里否则penInfo是未定义的)。

//SeqList.c文件中
typedef peoInfo SLDataType;

     现在让我们回到 typedef struct SeqList Contact 这段代码中。

     再说之前要知道对通讯录操作其实就是对顺序表操作,即通讯录就是顺序表,这其实就是把顺序表的名字改为通讯录。

     这里其实不写这段代码也是OK的。但是,你是要对通讯录操作。如果不改名字,那就是对顺序表操作(虽然它们一样)。你想啊,通讯录写的好好的突然出现顺序表,在我们看来还好但是对于其他人来说就很懵。这里改名字其实就是为了更方便理解

     既然想用顺序表那要在Contact.h里包含SeqList.h头文件,但是头文件是不能相互包含的。所以这里要对顺序表的结构体进行前置声明。这里不能用SL,因为是先定义完顺序表结构体之后在重命名的,如果直接用SL会被认为是未定义的。所以要用 struct SeqList 。

//这种是错误的!!!
struct SeqList;//前置声明
typedef SL Contact;

     

     这是正确的!!!

struct SeqList;//前置声明
typedef struct SeqList Contact;

     可以把前置声明放在重命名里,最后就变成了这样。

typedef struct SeqList Contact;

     用户信息的结构体就是放在通讯录的每一个下标里。

     只要把这里给理解了,下面的代码就很轻松了。 

功能实现

初始化通讯录

     初始化调用一下SLInit函数就好。

//初始化
void ContactInit(Contact* con)
{
	SLInit(con);
}

销毁通讯录

     销毁调用一下SLDestroy函数就好。

//销毁
void ContactDesTroy(Contact* con)
{
	SLDestroy(con);
}

增加用户信息

     这里创建一个penInfo的变量info。然后一个一个输入内容。最后调用SLpushBack尾插即可。

//增加
void ContactAdd(Contact* con)
{
	peoInfo info;
	printf("请输入联系人的名字:\n");
	scanf("%s", info.name);

	printf("请输入联系人的性别:\n");
	scanf("%s", info.gender);

	printf("请输入联系人的年龄:\n");
	scanf("%d", &info.age);

	printf("请输入联系人的电话:\n");
	scanf("%s", info.tel);

	printf("请输入联系人的地址:\n");
	scanf("%s", info.addr);

	SLpushBack(con, info);
    printf("增加成功!\n");
}

     大家可能注意到了只有年龄的scanf中加了&,为什么呢?

     因为它不是数组,其它都是数组。

删除指定用户信息

     在删除数据前要先检查有无该人,其实不光是删除还有查找,修改的函数都要用到。所以把它独立成一个函数,函数名是Findbyname。

     我在这里是用名字来查找的,遍历一遍如果存在返回顺序表下标,否则返回-1。

     判断是否存在的判断条件,我是用strcmp函数来实现的,如果它的返回值为0则存在。

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

     剩下的要先创建一个数组来存放要删除人的名字,然后调用Findbyname函数,如果返回值小于0则退出。否则调用SLErase函数用来删除。

//删除
void ContactDel(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}
	SLErase(con, find);
	printf("删除成功!\n");
}

     注意:开辟数组的大小要和结构体(penInfo)的名字数组大小一样大。

查找用户信息

     依然是要开辟数组然后调用Findbyname函数,如果小于0则退出,否则打印此人的信息。

//查找
void ContactFind(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}
	printf("名字  性别  年龄  电话  地址\n");
	printf("%s    %s    %d    %s    %s\n",
		con->arr[find].name,
		con->arr[find].gender,
		con->arr[find].age,
		con->arr[find].tel,
		con->arr[find].addr);
}

修改用户信息

     前面的代码同上,只不过如果返回值大于0则重新输入他的信息即可。

//修改
void ContactModify(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}

	printf("请修改联系人的名字:\n");
	scanf("%s", con->arr[find].name);

	printf("请修改联系人的性别:\n");
	scanf("%s", con->arr[find].gender);

	printf("请修改联系人的年龄:\n");
	scanf("%d", &con->arr[find].age);

	printf("请修改联系人的电话:\n");
	scanf("%s", con->arr[find].tel);

	printf("请修改联系人的地址:\n");
	scanf("%s", con->arr[find].addr);

	printf("修改成功!\n");
}

显示用户信息

     遍历一遍的同时打印即可。

//展示
void ContactShow(Contact* con)
{
	for (int i = 0; i < con->size; i++)
	{
		printf("名字  性别  年龄  电话  地址\n");
		printf("%s    %s    %d    %s    %s\n",
			con->arr[i].name,
			con->arr[i].gender,
			con->arr[i].age,
			con->arr[i].tel,
			con->arr[i].addr);
	}
}

全代码

Contact.h

#define NAME_MAX 20
#define GEMDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100

typedef struct personInfo
{
	char name[NAME_MAX];//名字
	char gender[GEMDER_MAX];//性别
	int age;//年龄
	char tel[TEL_MAX];//电话
	char addr[ADDR_MAX];//地址
}peoInfo;

typedef struct SeqList Contact;

//初始化
void ContactInit(Contact* con);

//销毁
void ContactDesTroy(Contact* con);

//增加
void ContactAdd(Contact* con);

//删除
void ContactDel(Contact* con);

//修改
void ContactModify(Contact* con);

//查找
void ContactFind(Contact* con);

//展示
void ContactShow(Contact* con);

Contact.c

#include "SeqList.h"
#include "Contact.h"

//初始化
void ContactInit(Contact* con)
{
	SLInit(con);
}

//销毁
void ContactDesTroy(Contact* con)
{
	SLDestroy(con);
}

//增加
void ContactAdd(Contact* con)
{
	peoInfo info;
	printf("请输入联系人的名字:\n");
	scanf("%s", info.name);

	printf("请输入联系人的性别:\n");
	scanf("%s", info.gender);

	printf("请输入联系人的年龄:\n");
	scanf("%d", &info.age);

	printf("请输入联系人的电话:\n");
	scanf("%s", info.tel);

	printf("请输入联系人的地址:\n");
	scanf("%s", info.addr);

	SLpushBack(con, info);
	printf("增加成功!\n");
}


int Findbyname(Contact* con, char name[])
{
	for (int i = 0; i < con->size; i++)
	{
		if (strcmp(con->arr[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//删除
void ContactDel(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}
	SLErase(con, find);
	printf("删除成功!\n");
}

//修改
void ContactModify(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}

	printf("请修改联系人的名字:\n");
	scanf("%s", con->arr[find].name);

	printf("请修改联系人的性别:\n");
	scanf("%s", con->arr[find].gender);

	printf("请修改联系人的年龄:\n");
	scanf("%d", &con->arr[find].age);

	printf("请修改联系人的电话:\n");
	scanf("%s", con->arr[find].tel);

	printf("请修改联系人的地址:\n");
	scanf("%s", con->arr[find].addr);

	printf("修改成功!\n");
}

//查找
void ContactFind(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}
	printf("名字  性别  年龄  电话  地址\n");
	printf("%s    %s    %d    %s    %s\n",
		con->arr[find].name,
		con->arr[find].gender,
		con->arr[find].age,
		con->arr[find].tel,
		con->arr[find].addr);
}

//展示
void ContactShow(Contact* con)
{
	for (int i = 0; i < con->size; i++)
	{
		printf("名字  性别  年龄  电话  地址\n");
		printf("%s    %s    %d    %s    %s\n",
			con->arr[i].name,
			con->arr[i].gender,
			con->arr[i].age,
			con->arr[i].tel,
			con->arr[i].addr);
	}
}

     好了讲到这儿就差不多讲完了,希望你能有所收获。如果有错误的地方请及时指出,有什么不懂的地方可以私信我哈。

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

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

相关文章

为什么跑腿越来越受到年轻人的青睐

跑腿服务越来越受到年轻人的青睐&#xff0c;主要源于以下几个方面的原因&#xff1a; 1. 便捷快速&#xff1a;在快节奏的现代生活中&#xff0c;年轻人追求的是效率和速度。跑腿服务提供了一种即时、便捷的解决方案&#xff0c;使他们能够在繁忙的生活和工作中节省时间和精力…

鸿蒙开发实战:智能日志定位与高效调试技巧

前言 在鸿蒙系统的开发过程中,日志定位是一个关键的调试步骤。想象一下,如果你能够轻松地在繁杂的代码中快速定位到日志产生的位置,那将会极大地提高你的开发效率。今天,我将分享一套代码,它能帮助你实现这一目标。 效果展示 当你使用这套代码时,日志的打印效果将如下…

qt开发解压缩zip文件实现

作者开发环境&#xff1a;Qt5.8 &#xff0c;win10 总体思路&#xff1a;首先我们编译zip源码&#xff0c;生成zip的动态库&#xff1b;然后再编译quazip源码&#xff0c;得到quazip的动态库&#xff1b;最后在我们的程序中去调用。 详细步骤&#xff1a; 1、编译zlib zlib…

Day22 代码随想录打卡|字符串篇---实现 strStr()

题目&#xff08;leecode T28&#xff09;&#xff1a; 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1…

WSL2中使用USB串口实验

一、主要参考网站: Connect USB devices | Microsoft Learn 连接 USB 设备 | Microsoft Learn 二、安装usbipd-win WSL 本身并不支持连接 USB 设备,因此你需要安装开源 usbipd-win 项目 PS C:\Users\issta> winget install --interactive --exact dorssel.usbipd-win …

yaml配置文件的在深度学习中的简单应用

1 .创作灵感 小伙伴们再阅读深度学习模型的代码的时候&#xff0c;经常会遇到yaml格式的配置文件。用这个配置文件是因为我们在训练模型的时候会涉及很多的参数&#xff0c;如果这些参数东一个&#xff0c;西一个&#xff0c;我们调起来的时候就会很不方便&#xff0c;所以用y…

Springboot+vue项目人事管理系统

开发语言&#xff1a;Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架:springbootvue JDK版本&#xff1a;jdk1.8 文末获取源码 系统主要分为管理员和普通用户和员工三部分&#xff0c;主要功能包括个人中心&#xff0c;普通用户管理&…

4.用python爬取保存在text中的格式为m3u8的视频

文章目录 一、爬取过程详解1.寻找视频的m3u8链接2.从网页源码中寻找视频的m3u8链接的第二部分内容3.从视频的m3u8链接获取视频 二、完整的代码 一、爬取过程详解 1.寻找视频的m3u8链接 这个文档承接了爬虫专栏的 第一节.python爬虫爬取视频网站的视频可下载的源url&#xff0…

头歌实践教学平台:CG3-v2.0-图形几何变换

第1关&#xff1a;平移、缩放、旋转正方体 一. 任务描述 1. 本关任务 (1) 理解几何变换基本原理, 掌握平移、旋转、缩放变换的方法; (2) 根据平移算法原理补全translation、scale、rotation_x、rotation_y和rotation_z函数; (3) 根据几何变换基本原理,将main函数中的transla…

RK3568 学习笔记 : Linux emmc 内核启动 rootfs 根文件系统无法正常挂载问题的分析

问题描述 平台 &#xff1a; NanoPi-R5C 开发板 RK3568 平台。 手动编译的 Linux 内核&#xff0c;结果发现大概率 emmc 无法正常初始化&#xff0c;导致 rootfs 根文件系统无法正常挂载 Linux 内核版本&#xff1a; 6.1 Linux 内核代码位置&#xff1a; https://github.com…

上网行为监控软件有哪些(上网审计软件)【收藏】

上网行为监控软件&#xff08;也被称为上网审计软件&#xff09;正逐渐成为企业信息安全管理的必备工具。 没错&#xff01; 这些软件通过对员工的上网行为进行全面、细致的监控和审计&#xff0c;帮助企业提升工作效率、保护数据安全&#xff0c;并规范员工的网络使用行为。 …

Springboot+vue项目健身房课程预约平台

开发语言&#xff1a;Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架:springbootvue JDK版本&#xff1a;jdk1.8 本系统主要实现了首页、个人中心、用户管理、教练管理、会员卡管理、购买会员管理、课程类型管理、课程信息管理、课程购买…

生信新包|LINGER·从单细胞多组学数据推断基因调控网络

题目&#xff1a;Inferring gene regulatory networks from single-cell multiome data using atlas-scale external data 原理 LINGER 是一个计算框架&#xff0c;旨在从单细胞多组学数据推断基因调控网络。 使用基因表达和染色质可及性的计数矩阵以及细胞类型注释作为输入&…

Linux下创建达梦数据库自动备份任务

分享一个自己用的银河麒麟下达梦数据库自动备份任务脚本。 达梦数据库备份脚本。按日期备份&#xff0c;备份后压缩为tar.gz文件&#xff0c;自动清理导出的文件。 备份脚本保留最后30天记录&#xff0c;以节省硬盘空间&#xff0c;可根据具体情况修改。 达梦数据库备份脚本 …

​​​【收录 Hello 算法】第 4 章 数组与链表

第 4 章 数组与链表 数据结构的世界如同一堵厚实的砖墙。 数组的砖块整齐排列&#xff0c;逐个紧贴。链表的砖块分散各处&#xff0c;连接的藤蔓自由地穿梭于砖缝之间。 本章内容 4.1 数组4.2 链表4.3 列表4.4 内存与缓存 *4.5 小结

解决github无法克隆私有仓库,Repository not found问题(2024最新)

一、背景 这个问题出现&#xff0c;是你用了其他主机设备&#xff0c;需要重新clone私有库时&#xff0c;发现一直报找不到仓库&#xff0c;如下报错&#xff1a; remote: Repository not found.二、解决方法 &#xff08;1&#xff09;账号密码方式&#xff08;已不支持&am…

CSDN上是不是有机器人点赞和收藏?

我在CSDN上写作&#xff0c;主要是本来是记录学习工作中的一些知识点&#xff0c;看得人不多本来就能预想到的。 但是今天发现五一写的一篇博客&#xff0c;出现了很奇怪的阅读、点赞、收藏数。只有2个人阅读&#xff0c;但是有8个点赞&#xff0c;还有5个收藏。 我不禁怀疑CS…

怎么扫描二维码看图片?在线制作图片二维码的方法

随着现在二维码的广泛使用&#xff0c;用这个方式来展现内容的情况越来越多&#xff0c;比如扫码看图就是一种很常见的一种类型。将图片生成二维码后通过扫码来调取云端存储的图片查看&#xff0c;这样可以一次预览多张图片并且不会占据内存&#xff0c;能够快速的实现图片内容…

Flutter笔记:Widgets Easier组件库(11)- 使用提示吐丝(Tip Toasts)

Flutter笔记 Widgets Easier组件库&#xff08;11&#xff09;使用提示吐丝 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

C++之QT文本处理QDir、QFileDialog、QStringList、QFile

一、相应的头文件 #include <QFileDialog> #include <QDir> #include <QStringList> 二、简介 1.QFileDialog 实际效果如下&#xff1a;比如需要选择打开的文件夹或者文件名&#xff0c;通过调用资源管理器的方式进行可视化操作。 代码示例为&#xff1a…