通讯录的实现(顺序表)

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

目录

一.准备工作 

二.通讯录的实现

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 15typedef 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 15typedef 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.cvoid 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.mzph.cn/news/823488.shtml

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

相关文章

手机副业赚钱秘籍:让你的手机变成赚钱利器

当今社会&#xff0c;智能手机已然成为我们生活不可或缺的一部分。随着技术的飞速进步&#xff0c;手机不再仅仅是通讯工具&#xff0c;而是化身为生活伴侣与工作助手。在这个信息爆炸的时代&#xff0c;我们时常会被一种焦虑感所困扰&#xff1a;如何能让手机超越消磨时光的定…

TinyEMU源码分析之访存处理

TinyEMU源码分析之访存处理 1 访存指令介绍2 指令译码3 地址转换3.1 VA与PA3.2 VA转PA 4 判断地址空间范围5 执行访存操作5.1 访问RAM内存5.2 访问非RAM&#xff08;设备&#xff09;内存 6 访存处理流程图 本文属于《 TinyEMU模拟器基础系列教程》之一&#xff0c;欢迎查看其…

【AI】什么是Ai Agent

什么是AI Agent&#xff1f; AI Agent是指人工智能代理&#xff08;Artificial Intelligence Agent&#xff09;是一种能够感知环境进行自主理解&#xff0c;进行决策和执行动作的智能体。AI Agent具备通过独立思考、调用工具逐步完成给定目标的能力。不同于大模型的区别在于&…

OpenHarmony实战开发-如何使用屏幕属性getDefaultDisplaySync、getCutoutInfo接口实现适配挖孔屏。

介绍 本示例介绍使用屏幕属性getDefaultDisplaySync、getCutoutInfo接口实现适配挖孔屏。该场景多用于沉浸式场景下。 效果图预览 使用说明 1.加载完成后顶部状态栏时间和电量显示位置规避了不可用区域。 实现思路 1.通过setWindowLayoutFullScreen、setWindowSystemBarEn…

代码随想录训练营

Day23代码随想录 669.修剪二叉搜索树 1.题目描述 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有…

Hbase的简单学习一

一 Hbase的搭建与安装 1.1 安装 1.准备好文件&#xff0c;上传到Linux上 2.解压文件 tar zxvf hbase-2.2.7-bin.tar.gz -C ../ ../是解压到的路径 1.2 配置文件 1.配置环境变量 去etc/profile目录下 export HBASE_HOME/usr/local/soft/hbase-2.2.7 export PATH$PATH:$H…

.NET SignalR Redis实时Web应用

环境 Win10 VS2022 .NET8 Docker Redis 前言 什么是 SignalR&#xff1f; ASP.NET Core SignalR 是一个开放源代码库&#xff0c;可用于简化向应用添加实时 Web 功能。 实时 Web 功能使服务器端代码能够将内容推送到客户端。 适合 SignalR 的候选项&#xff1a; 需要从服…

AI预测福彩3D第38弹【2024年4月17日预测--第8套算法开始计算第6次测试】

今天咱们继续测试第8套算法和模型&#xff0c;今天是第5次测试&#xff0c;目前的测试只是为了记录和验证&#xff0c;为后续的模型修改和参数调整做铺垫&#xff0c;所以暂时不建议大家盲目跟买~废话不多说了&#xff0c;直接上结果&#xff01; 2024年4月17日3D的七码预测结果…

K8S node节点执行kubectl get pods报错

第一个问题是由第二个问题产生的&#xff0c;第二个问题也是最常见的 网上找的都是从master节点把文件复制过来&#xff0c;这样确实可以解决&#xff0c;但是麻烦&#xff0c;有一个node节点还好&#xff0c;如果有多个呢&#xff1f;每个都复制吗&#xff1f;下面是我从外网…

RabbitMQ-核心特性

已经不需要为RabbitMQ交换机的离去而感到伤心了&#xff0c;接下来登场的是RabbitMQ-核心特性!!! 文章目录 核心特性消息过期机制消息确认机制死信队列 核心特性 消息过期机制 官方文档&#xff1a;https://www.rabbitmq.com/ttl.html 可以给每条消息指定一个有效期&#xf…

Ubuntu 20.04.06 PCL C++学习记录(二十五)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16&#xff0c;可用点云下载地址 学习内容 使用渐进形态滤波器分割识别地面回波&#xff0c;即执…

【一竞技CS2】VP战队官宣签下electroNic取代mir

1、近日VP战队官宣签下electroNic&#xff0c;以取代阵容中的mir。 electroNic自己也表示&#xff1a;“VP是一支顶级队伍。阵容核心曾赢得Major冠军&#xff0c;所有队员都处于巅峰状态并且时刻准备着去争夺冠军。我们有着一样的雄心壮志。 此外我还对和Jame很感兴趣&#xf…

C++从入门到精通——const与取地址重载

const与取地址重载 前言一、const正常用法const成员函数问题const对象可以调用非const成员函数吗非const对象可以调用const成员函数吗const成员函数内可以调用其它的非const成员函数吗非const成员函数内可以调用其它的const成员函数吗总结 二、取地址及const取地址操作符重载概…

如何用Jenkins执行自动化测试构建

摘要 依据Jenkins官网介绍&#xff0c;Jenkins是一个流行的开源持续集成和交付工具&#xff0c;它提供了一个可扩展的插件生态系统&#xff0c;可以用于自动化构建、测试和部署软件项目。 本文介绍如何安装使用Jenkins、常见问题解决方案以及深入应用&#xff0c;为自动化测试…

艾迪比皮具携手工博科技SAP ERP公有云,打造数字化转型新标杆

4月1日&#xff0c;广州市艾迪比皮具有限公司&#xff08;以下简称“艾迪比”&#xff09;SAP S/4HANA Cloud Public Edition&#xff08;以下简称“SAP ERP公有云”&#xff09;项目正式启动。双方项目组领导、成员出席本次项目启动会&#xff0c;为未来项目的顺利实施打下坚实…

滚雪球学Java(74):深入理解JavaSE输入输出流:掌握数据流动的奥秘

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴 bug菌&#xff0c;今天又来给大家手把手教学Java SE系列知识点啦&#xff0c;赶紧出来哇&#xff0c;别躲起来啊&#xff0c;听我讲干货记得点点赞&#xff0c;赞多了我就更有动力讲得更欢哦&#xff01;所以呀&…

nginx学习记录-动静分离

1. 动静分离原理 我们在访问网站资源的时候&#xff0c;通常会将资源分成两种&#xff0c;一种是静态资源&#xff08;前端的固定界面&#xff0c;比如图片&#xff0c;html页面等&#xff09;&#xff0c;这些资源无需后台程序处理&#xff1b;另一种是动态资源&#xff0c;这…

分布式调度器

xxl-job介绍 xxl-job 是一个轻量级分布式任务调度框架&#xff0c;支持动态添加、修改、删除定时任务&#xff0c;支持海量任务分片执行&#xff0c;支持任务执行日志在线查看和分页查询&#xff0c;同时支持任务失败告警和重试机制&#xff0c;支持分布式部署和高可用。xxl-j…

阿里云、腾讯云、华为云优惠券领取入口整理汇总

阿里云、腾讯云、华为云作为国内领先的云服务提供商&#xff0c;一直以其稳定、高效、安全的服务赢得了广大用户的青睐。为了回馈用户&#xff0c;这些云平台经常会推出各种优惠活动&#xff0c;其中最为常见的便是优惠券。本文将为大家整理汇总阿里云、腾讯云、华为云优惠券的…

linux-centos虚拟机设置固定ip

环境准备 虚拟机版本&#xff1a;centos7 安装环境&#xff1a;vmware17 1、设置网络连接 虚拟机-设置-网络适配器-NAT模式 2、查看子网信息 编辑-虚拟网络编辑器-NAT模式-NAT设置 查看子网ip和网关ip 下一步要用 3、修改配置文件 vim /etc/sysconfig/network-scripts…