通讯录的实现(顺序表)

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

目录

一.准备工作 

二.通讯录的实现

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;

}

五.结言

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

谢谢大家的支持!!!

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

拜拜了!!!

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

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

相关文章

Arthas实战教程:定位Java应用CPU过高与线程死锁

引言 在Java应用开发中&#xff0c;我们可能会遇到CPU占用过高和线程死锁的问题。本文将介绍如何使用Arthas工具快速定位这些问题。 准备工作 首先&#xff0c;我们创建一个简单的Java应用&#xff0c;模拟CPU过高和线程死锁的情况。在这个示例中&#xff0c;我们将编写一个…

OpenHarmony C/C++三方库移植适配

简介 众所周知&#xff0c;C/C三方库相对与JS/ETS的三方组件来说&#xff0c;其运行效率高。那如何将一个C/C三方库移植到OH系统上呢&#xff1f;本文将介绍如何快速高效的移植一个C/C三方库到OpenHarmony上。 C/C三方库适配问题与解决方案 由上图可以看出&#xff0c;三方库…

Ypay源支付前端美化模板

功能&#xff1a; 首页加了运行时间&#xff0c;加了首页一言打字效果&#xff0c;加了访问次数&#xff0c;还有底部也适当的加了一点美化 而且加了一个播放器功能&#xff0c;可以自定义歌曲之类的 完美契合于源支付 直接上传主题包使用即可 演示图: 使用: 请不要在后台…

C语言学习笔记之指针(一)

目录 什么是指针&#xff1f; 指针和指针类型 指针的类型 指针类型的意义 指针-整数 指针的解引用 指针 - 指针 指针的关系运算 野指针 什么是野指针&#xff1f; 野指针的成因 如何规避野指针&#xff1f; 二级指针 什么是指针&#xff1f; 在介绍指针之前&#…

Ubuntu上安装Chrome浏览器

安装步骤 1.下载安装chrome安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb2.安装Chrome浏览器 sudo dpkg -i google-chrome-stable_current_amd64.debsudo apt-get -f install3.启动Chrome浏览器 查看收藏夹里的Chrome图标 单击C…

LeetCode刷题总结 | 图论3—并查集

并查集理论基础 1.背景 首先要知道并查集可以解决什么问题呢&#xff1f; 并查集常用来解决连通性问题。大白话就是当我们需要判断两个元素是否在同一个集合里的时候&#xff0c;我们就要想到用并查集。 并查集主要有两个功能&#xff1a; 将两个元素添加到一个集合中。判…

python怎么连接oracle

一&#xff1a;弄清版本&#xff0c;最重要&#xff01;&#xff01;&#xff01; 首先安装配置时&#xff0c;必须把握一个点&#xff0c;就是版本一致&#xff01;包括&#xff1a;系统版本&#xff0c;python版本&#xff0c;oracle客户端的版本&#xff0c;cx_Oracle的版本…

IAR 使用笔记(IAR BIN大小为0异常解决)

烧写 由于芯片的内部SPI FLASH的0级BOOT 程序起到到开启JTAG SW 仿真功能&#xff0c;一旦内部SPI FLASH存储的BL0启动代码被损坏&#xff0c;芯片的JTAG 将不能被连接。所以对BL0的烧写需要谨慎&#xff0c;烧写BL0过程保证芯片不断电。 如果烧写了多备份的启动代码&#xff…

深度学习架构(CNN、RNN、GAN、Transformers、编码器-解码器架构)的友好介绍。

一、说明 本博客旨在对涉及卷积神经网络 &#xff08;CNN&#xff09;、递归神经网络 &#xff08;RNN&#xff09;、生成对抗网络 &#xff08;GAN&#xff09;、转换器和编码器-解码器架构的深度学习架构进行友好介绍。让我们开始吧&#xff01;&#xff01; 二、卷积神经网络…

【Java探索之旅】掌握数组操作,轻松应对编程挑战

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、数组巩固练习1.1 数组转字符串1.2 数组拷贝1.3 求数组中的平均值1.4 查找数组中指…

手写签名功能(vue3)

手写签名功能&#xff08;vue3&#xff09; 效果 显示效果 签名版效果 代码 代码引入 写成子组件形式&#xff0c;直接引入即可 <signature-features />代码结构 signatureFeatures&#xff1a;签名的显示效果 vueEsign&#xff1a;画板 xnSignName&#xff1a;打开…

Ubuntu修改DNS

【永久修改DNS】 临时修改DNS的方法是在 /etc/resolv.conf 添加&#xff1a;nameserver 8.8.8.8 nameserver 8.8.8.8 注意到/etc/resolv.conf最上面有这么一行&#xff1a; DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN 说明重启之后这个文件会被自动…

关于系统数据缓存的思考以及设计

文章目录 引言案例A项目B项目 分析我的实现总结 引言 缓存&#xff0c;这是一个经久不衰的话题&#xff0c;它通过“空间换时间”的战术不仅能够极大提升处理查询性能还能很好的保护底层资源。最近针对系统数据缓存的优化后&#xff0c;由于这是一个通用的场景并且有了一点心得…

力扣练习题(2024/4/15)

1打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋…

java实现论文查重,文本查重方案 采用 ansj 分词法

需求要求实现一个文本查重&#xff0c;重复率超过70% 就不让用户新增文本。固研究实现基于java的文本查重工具&#xff0c;分享出来方便大家使用&#xff5e; ansj 分词法介绍 Ansj 是一个开源的 Java 中文分词工具&#xff0c;基于中科院的 ictclas 中文分词算法&#xff0c…

THS6.0.1.0开启健康检查(by lqw)

可以在节点管理器或者分组管理的编辑配置里添加以下信息&#xff1a; 之后点监控,点击实时指标&#xff0c;点击HTTP集群统计&#xff1a; 下图是配置并生效的效果&#xff1a; 也可以使用頁面配置&#xff1a; 推荐使用tcp形式&#xff0c;有的应用后端可能不支持http…

代理知识科普:为什么有的代理IP速度比较慢呢?

代理IP在跨境业务中被广泛的应用&#xff0c;今天我们将一同深入探讨一个问题&#xff1a;“为什么有的IP代理速度比较慢&#xff1f;”随着数字化时代的不断发展&#xff0c;代理服务成为了许多网络操作的关键环节。然而&#xff0c;有时我们可能会遇到IP代理速度慢的问题&…

MT3026 砍玉米

样例1&#xff1a; 输入&#xff1a; 6 1 3 4 2 5 1 7 8 19 10 30 2 输出&#xff1a; 6 其中1<n<10^5,1<xi,hi<10^9 思路&#xff1a;贪心&#xff1a;从左到右或者从右到左依次判断每一棵玉米是否可以倒下 &#xff08;以从左到右为例&#xff1a;先往左倒&…

[论文笔记]Root Mean Square Layer Normalization

引言 今天带来论文Root Mean Square Layer Normalization的笔记&#xff0c;论文题目是均方根层归一化。 本篇工作提出了RMSNorm&#xff0c;认为可以省略重新居中步骤。 简介 层归一化对Transformer等模型非常重要&#xff0c;它可以帮助稳定训练并提升模型收敛性&#xf…

生成对抗网络GAN的扩展应用理解

注&#xff1a;本文仅个人学习理解&#xff0c;如需详细内容请看原论文&#xff01; 一、cycleGAN 1.整体架构&#xff1a; 将图片A通过生成器生成图片B&#xff0c;然后通过判别器判别图片B的真假&#xff1b;并且图片B通过另一个生成器生成A‘&#xff0c;让A和A’近似。 2…