通讯录的实现(顺序表)

news2024/12/23 4:03:55

前言:上篇文章我们讲解的顺序表以及顺序表的具体实现过程,那么我们的顺序表在实际应用中又有什么作用呢?今天我们就基于顺序表来实现一下通讯录。

目录

一.准备工作 

二.通讯录的实现

1.通讯录的初始化

2.插入联系人 

3.删除联系人

4.查找联系人 

5.修改联系人 

6.通讯录引入文件操作 

7.通讯录销毁 

三.通讯录测试代码 

四.所有实现代码

五.结言


一.准备工作 

在准备通讯录的实现前我们要先清楚我们的通讯录要实现什么功能。

1.首先我们的添加以及删除联系人是必不可少的.

2.还有对已有联系人的查找,以及修改.

3.当我们储存完之后还要看我们的通讯录存储的信息,也就是打印通讯录.

4.我们还可以将每次输入的信息存入文件中每次打开通讯录时再次打印。

(注:通讯录的一部分代码是直接引用的顺序表代码如有看不懂的可以去上一篇文章中查看)

二.通讯录的实现

1.通讯录的初始化

void ConInit(SL* sl)
{
	SLinit(&sl);
}

这边的代码我们就只需要引用上一篇顺序表的初始化代码就可以了.

2.插入联系人 

void ConPush(SL* sl)
{
	assert(sl);
	Con con;

	printf("请输入姓名>|");
	scanf("%s", con.name);
	printf("\n");
	printf("请输入性别>|");
	scanf("%s", con.sex);
	printf("\n");
	printf("请输入电话>|");
	scanf("%s", con.tele);
	printf("\n");
	printf("请输入年龄>|");
	scanf("%d",&( con.age));
	printf("\n");
	SLbackpush(sl, con);
}

在插入联系人这以过程中我们把sl->a的类型改为我们创建的联系人信息

#define NAME 20
#define AREA 50
#define SEX 10
#define TELE 15

typedef struct Con {
	char name[NAME];
	int age;
	//char area[AREA];
	char sex[SEX];
	int tele[TELE];
}Con;
typedef Con SLType;

typedef struct SL
{
	SLType* a;
	int size;
	int capacity;
}SL;

这样我们在添加数据时我们可以直接将Con传入我们顺序表的尾插代码中。

3.删除联系人

在写删除代码时我们需要一个需要确定删除哪一个联系人,并且后面的修改查找也会用到相应的操作,所以我们将通过名字寻找包装成一个函数,一边后续代码的书写。

int ConByname(SL* sl, char* name)
{
	assert(sl);
	for (int i = 0; i < sl->size; i++)
	{
		if (strcmp(sl->a[i].name,name)==0)
		{
			return i;
		}
	}
	return 0;
}

接下来我们写联系人删除的操作代码:

void Conpop(SL* sl)
{
	assert(sl);
	printf("请输入要删除人的姓名\n");
	char name[10] = { 0 };
	scanf("%s", name);
	int ret = ConByname(sl, name);
	if (ret >= 0)
	{
		SLrandompop(sl, ret);
		printf("删除成功!\n");
	}
	else
	{
		printf("删除失败,没有此联系人\n");
	}
}

是不是也没有什么难的。

4.查找联系人 

同样我们也是需要我们的通过名称寻找联系人,具体代码如下:

void ConFind(SL* sl)
{
	assert(sl);
	printf("请输入要查找人的姓名\n");
	char name[10];
	scanf("%s", name);
	int i = ConByname(sl, name);
	if (i >= 0)
	{
		printf("%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
	}
	else
	{
		printf("没有找到此联系人\n");
	}
}

5.修改联系人 

void ConModify(SL* sl)
{
	assert(sl);
	printf("请输入要修改人的姓名\n");
	char name[10];
	scanf("%s", name);
	int i = ConByname(sl, name);
	if (i >= 0)
	{
		printf("请输入姓名>|");
		scanf("%s", sl->a[i].name);
		printf("\n");
		printf("请输入性别>|");
		scanf("%s", sl->a[i].sex);
		printf("\n");
		printf("请输入电话>|");
		scanf("%s", sl->a[i].tele);
		printf("\n");
		printf("请输入年龄>|");
		scanf("%d", &(sl->a[i].age));
		printf("\n");
		printf("修改成功\n");
	}
	else
	{
		printf("修改失败没有此联系人\n");
	}
}

也跟上面的代码大同小异。

6.通讯录引入文件操作 

为了增加我们代码的实用性,我们引用我们前几篇博客说到的文件操作,将每次存入的联系人存放到文件当中。

具体代码如下:

void ConPutFile(SL* sl)
{
	assert(sl);
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
		return;
	}
	for (int i = 0; i < sl->size; i++)
	{
		fprintf(pf,"%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
	}
}
void ConPushFile(SL* sl)
{
	assert(sl);
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return;
	}
	for (int i = 0; i < sl->size; i++)
	{
		fscanf(pf,"%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
	
	}
}

7.通讯录销毁 

 

void ConDestory(SL* sl)
{
	SLdestory(&sl);
}

三.通讯录测试代码 

void menu()
{
	printf("********************************\n");
	printf("***0.退出通讯录  1.增加联系人***\n");
	printf("***2.删除联系人  3.查看通讯录***\n");
	printf("***4.查找联系人  5.修改联系人***\n");
	printf("********************************\n");

}
int main()
{
	
	int input = 0;
	SL con = { 0 };
	ConInit(&con);
	ConPushFile(&con);
	do {
		menu();
		printf("请选择要进行的操作\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			ConPush(&con);
			break;
		case 2:
			Conpop(&con);
			break; 
		case 3:
			ConPrint(&con);
				break;
		case 4:
			ConFind(&con);
			break;
		case 5:
			ConModify(&con);
			break;
		case 0:
			printf("推出成功\n");
			break;
		default:
			printf("输入错误请重新输入\n");
			break;
		}
		

	} while (input);
	ConPutFile(&con);
	//ConDestory(&con);
	return 0;

}

 我们采用do  while(ture)循环来实现,这样我们的代码就大大增加的实用性。

四.所有实现代码

这里不再写关于顺序表的代码操作,如有需要请看上一篇博客。

Con.h

#pragma once

#define NAME 20
#define AREA 50
#define SEX 10
#define TELE 15

typedef struct Con {
	char name[NAME];
	int age;
	//char area[AREA];
	char sex[SEX];
	int tele[TELE];
}Con;
typedef struct SL SL;
void ConInit(SL* sl);
void ConPushFile(SL* sl);
void ConPush(SL* sl);
void Conpop(SL* sl);
void ConPrint(SL* sl);
void ConFind(SL* sl);
void ConModify(SL* sl);
void ConPutFile(SL* sl);
void ConDestory(SL* sl);

Con.c

#include"SL.h"

void ConInit(SL* sl)
{
	SLinit(&sl);
}
void ConPushFile(SL* sl)
{
	assert(sl);
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return;
	}
	for (int i = 0; i < sl->size; i++)
	{
		fscanf(pf,"%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
	
	}
}
void ConPush(SL* sl)
{
	assert(sl);
	Con con;

	printf("请输入姓名>|");
	scanf("%s", con.name);
	printf("\n");
	printf("请输入性别>|");
	scanf("%s", con.sex);
	printf("\n");
	printf("请输入电话>|");
	scanf("%s", con.tele);
	printf("\n");
	printf("请输入年龄>|");
	scanf("%d",&( con.age));
	printf("\n");
	SLbackpush(sl, con);
}

void ConPrint(SL* sl)
{
	assert(sl);
	printf("姓名  性别  年龄  电话  \n");
	for (int i = 0; i < sl->size; i++)
	{
		printf("%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
	}
}

int ConByname(SL* sl, char* name)
{
	assert(sl);
	for (int i = 0; i < sl->size; i++)
	{
		if (strcmp(sl->a[i].name,name)==0)
		{
			return i;
		}
	}
	return 0;
}
void Conpop(SL* sl)
{
	assert(sl);
	printf("请输入要删除人的姓名\n");
	char name[10] = { 0 };
	scanf("%s", name);
	int ret = ConByname(sl, name);
	if (ret >= 0)
	{
		SLrandompop(sl, ret);
		printf("删除成功!\n");
	}
	else
	{
		printf("删除失败,没有此联系人\n");
	}
}
void ConFind(SL* sl)
{
	assert(sl);
	printf("请输入要查找人的姓名\n");
	char name[10];
	scanf("%s", name);
	int i = ConByname(sl, name);
	if (i >= 0)
	{
		printf("%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
	}
	else
	{
		printf("没有找到此联系人\n");
	}
}
void ConModify(SL* sl)
{
	assert(sl);
	printf("请输入要修改人的姓名\n");
	char name[10];
	scanf("%s", name);
	int i = ConByname(sl, name);
	if (i >= 0)
	{
		printf("请输入姓名>|");
		scanf("%s", sl->a[i].name);
		printf("\n");
		printf("请输入性别>|");
		scanf("%s", sl->a[i].sex);
		printf("\n");
		printf("请输入电话>|");
		scanf("%s", sl->a[i].tele);
		printf("\n");
		printf("请输入年龄>|");
		scanf("%d", &(sl->a[i].age));
		printf("\n");
		printf("修改成功\n");
	}
	else
	{
		printf("修改失败没有此联系人\n");
	}
}
void ConPutFile(SL* sl)
{
	assert(sl);
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
		return;
	}
	for (int i = 0; i < sl->size; i++)
	{
		fprintf(pf,"%-5s %-5s %-5d %-5s \n", sl->a[i].name, sl->a[i].sex, sl->a[i].age, sl->a[i].tele);
	}
}
void ConDestory(SL* sl)
{
	SLdestory(&sl);
}

Contest.c

void menu()
{
	printf("********************************\n");
	printf("***0.退出通讯录  1.增加联系人***\n");
	printf("***2.删除联系人  3.查看通讯录***\n");
	printf("***4.查找联系人  5.修改联系人***\n");
	printf("********************************\n");

}
int main()
{
	
	int input = 0;
	SL con = { 0 };
	ConInit(&con);
	ConPushFile(&con);
	do {
		menu();
		printf("请选择要进行的操作\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			ConPush(&con);
			break;
		case 2:
			Conpop(&con);
			break; 
		case 3:
			ConPrint(&con);
				break;
		case 4:
			ConFind(&con);
			break;
		case 5:
			ConModify(&con);
			break;
		case 0:
			printf("推出成功\n");
			break;
		default:
			printf("输入错误请重新输入\n");
			break;
		}
		

	} while (input);
	ConPutFile(&con);
	//ConDestory(&con);
	return 0;

}

五.结言

好了关于顺序表以及顺序表的通讯录实现就到这里了,如果有哪里不足的欢迎大佬指出。

谢谢大家的支持!!!

喜欢的一键三连!!(看到一定会回的)

拜拜了!!!

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

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

相关文章

一篇文章详细介绍Stable Diffusion模型原理及实现过程(附常用模型网站、下载方式)

目录 前言 何为Stable Diffusion模型&#xff1f; Stable Diffusion工作原理&#xff1a; Stable Diffusion模型的应用场景 Stable Diffusion免费使用网站 stability.ai: 本地部署 Stable Diffusion方法&#xff1a; StableDiffusion中文网 博主介绍&#xff1a;✌专注于前后端…

任务管理与守护进程

1.前台进程与后台进程 1.1守护进程 在上一章中&#xff0c;我们实现了一个Tcp服务器&#xff0c;但是这个服务器还存在一些问题&#xff0c;例如&#xff0c;我们将云服务器&#xff08;xshell&#xff09;关闭之后&#xff0c;服务器就无法使用了。 但是真正的服务器肯定不…

Stable Diffusion WebUI 控制网络 ControlNet 插件实现精准控图-详细教程

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文主要介绍 Stable Diffusion WebUI 一个比较重要的插件 ControlNet&#xff08;控制网络&#xff09;&#xff0c;主…

第46篇:随机存取存储器(RAM)模块<五>

Q&#xff1a;本期我们使用Quartus软件的IP Catalog工具创建双端口RAM。 A&#xff1a;前期创建的RAM存储模块只有一个端口&#xff0c;同时为读/写操作提供地址。我们将再创建一个具有两个地址输入端口的RAM模块&#xff0c;分别为读操作和写操作提供地址。选择Basic Functio…

Ubuntu:VSCode中编译运行C++代码

版本&#xff1a;Ubuntu22.04.1 LTS 目录 1 安装VSCode并汉化 2 检查Ubuntu是否已经安装了 GCC 3 在VScode中安装C/C扩展 4 在VSCode中进行C/C配置 1 安装VSCode并汉化 安装VSCode&#xff08;参考之前博客Ubuntu&#xff1a;安装VSCode_ubuntu vscode-CSDN博客&#xff…

两数相加(链表)

2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 题解 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。…

深入理解 pytest Fixture 方法及其应用

当涉及到编写自动化测试时&#xff0c;测试框架和工具的选择对于测试用例的设计和执行非常重要。在Python 中&#xff0c;pytest是一种广泛使用的测试框架&#xff0c;它提供了丰富的功能和灵活的扩展性。其中一个很有用的功 能是fixture方法&#xff0c;它允许我们初始化测试环…

Ypay源支付最新免授权牛角魔改版

YPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的ThinkPHP 6.1.2 Layui PearAdmin架构&#xff0c;提供实时监控和管…

【JavaWeb】Day47.Mybatis基础操作——删除

Mybatis基础操作 需求 准备数据库表 emp 创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&#xff09; application.properties中引入数据库连接信息 创建对应的实体类 Emp&#xff08;实体类属性采用驼峰命名&#xf…

反转二叉树(力扣226)

解题思路&#xff1a;用队列进行前序遍历的同时把节点的左节点和右节点交换 具体代码如下&#xff1a; class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root NULL) return root;swap(root->left, root->right); // 中invertTree(root->left)…

2022年团体程序设计天梯赛-总决赛 L1 -L2

目录 L1-1 今天我要赢 L1-2 种钻石 L1-3 谁能进图书馆 L1-4 拯救外星人 L1-5 试试手气 L1-6 斯德哥尔摩火车上的题 L1-7 机工士姆斯塔迪奥 L1-8 静静的推荐 L2-1 插松枝 L2-2 老板的作息表 L2-3 龙龙送外卖 L2-4 大众情人 L1-1 今天我要赢 分数 5 2018 年我们曾经出…

时间同步服务器的搭建

1.配置server主机&#xff1a; ①server主机的主机名称为 ntp_server.example.com reboot重启 ②server主机的IP为&#xff1a; 172.25.254.100 ③server主机的时间为1984-11-11 11&#xff1a;11&#xff1a;11 先关闭时间同步服务 设置时间为1984-11-11 11&#xff1a;11&…

vue3父组件使用子组件方法

问题 关于父组件调用子组件方法是比较常见的情况&#xff0c;vue2中使用比较简单&#xff0c;那么vue3 中如何使用呢&#xff1f; 想要的效果&#xff1a; vue2 中调用子组件方法 先看下vue2中如何调用的&#xff0c;代码如下&#xff1a; // child.vue <template>&…

Linux系统的引导过程与服务控制

目录 一、Linux操作系统引导过程 二、Linux系统服务控制 系统初始化进程 三、运行级别切换 *运行级别及切换 Linux系统的运行级别 四、优化开机自动加载服务 五、修复MBR扇区故障 一、Linux操作系统引导过程 主要步骤 开机自检&#xff1a; 检测硬件设备&#…

Matlab软件使用教学

1. Matlab简介 Matlab&#xff08;Matrix Laboratory的缩写&#xff09;是一种由MathWorks公司开发的数值计算和可视化编程环境。它广泛应用于工程、科学研究、数学和教育等领域&#xff0c;因其强大的计算能力和丰富的工具箱而受到青睐。 2. 安装与启动 安装&#xff1a;从M…

Delphi Xe 10.3 钉钉SDK开发——审批流接口(获取表单ProcessCode)

开发钉钉审批流时&#xff0c;需要用到钉钉表单的Processcode&#xff0c;有两种方法 &#xff1a; 一、手动获取&#xff1a; 管理员后台——审批——找到对应的表单&#xff1a;如图&#xff1a; ProcessCode后面就是了&#xff01; 二、接口获取&#xff1a;今天的重点&a…

精致摄影网站模板 Bootstrap4

目录 一.前言 二.展示 三.下载链接 一.前言 这是一个相机摄影网站。网站结构包括以下部分&#xff1a; 导航栏部分&#xff1a;位于页面顶部&#xff0c;包含了Logo和若干导航链接&#xff0c;如Home、About、Gallery、Services、Testimonial和Contact。 横幅部分&#xff…

CSS文本属性与字体属性

目录 文本属性 文本颜色 文本对齐 修饰文本 文本缩进 行高 字体属性 字体系列 字体大小 字体粗细 字体样式 字体/文本综合属性写法 Chrome调试工具的使用 文本属性 文本颜色 在CSS中使用color 属性用于定义文本的颜色&#xff0c;使用background-color设置一个盒…

VUE3 + Elementui-Plus 之 树形组件el-tree 一键展开(收起);一键全选(不全选)

需求&#xff1a; 产品要求权限树形结构添加外部复选框进行全部展开或收起&#xff1b;全选或不全选。 实现步骤&#xff1a; tree组件部分&#xff1a; <div class"role-handle"><div>权限选择(可多选)</div><div><el-checkbox v-mode…

micropython开发与实战阅读笔记

对本文的一些说明 本文来源于阅读《MicroPython开发与实战》时所做的笔记&#xff0c;这本书不是很厚&#xff0c;所以内容也不是很全面&#xff0c;但作为一个入门工具书还是够的&#xff0c;再由于本人不是这方面的大佬&#xff0c;也不是这个专业的&#xff0c;所做的笔记也…