顺序表的应用之通讯录

学习了顺序表之后,我们也得知道它的实际用途吧!所以,我们今天来学习一下通讯录的实现。

typedef struct personInfo SLDataType;

 contact.h

#define NAME_MAX 20
#define GENDER_MAX 20
#define GTEL_MAX 20
#define ADDR_MAX 100
#include"SeqList.h"//定义联系人数据结构
//姓名 性别 年龄 电话 地址
typedef struct PersonInfo
{char[NAME_MAX];gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];}peoInfo;
//通讯录的初始化
typedef struct SeqList Contact;//改通讯录的名字,没有包含顺序表的头文件,所以需要写出完整的名字
void ContactInit(Contact*con);
//通讯录的销毁
void ContactDestory(Contact*con);
//往通讯录里添加数据
void ContactAdd(Contact*con);
//通讯录的修改
void ContactModify(Contact*con);
//通讯录的查找
void ContactFind(Contact*con);
//通讯录的展示
void ContactShow(Contact*con);typedef int SLDataType;//通讯录增加删除数据

SeqList.h

#include"Contact.h"//把头文件加载进来
//typedef int SLDataType
typedef peoInfo SLDataType
{

contact.c

#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("%s",&info.age);printf("请输入要添加的联系人电话:\n”);scanf("%s",info.tel);printf("请输入要添加的联系人住址:\n”);scanf("%s",info.addr);//往通讯录中添加数据SLPushBack(con,info);//尾插,顺序表中已有方法的复用
}
//通讯录删除联系人
int FindByName(Contact*con,char name[])
{for(int i=0;i<con->size;i++){if(0==strcmo(con->arr[i].name,name)){//找到了return i;}}//没有找到return -1;
}void ContactDel(Contact* con)
{//要删除的文件必须存在,才能执行删除操作//查找int find=FindByName(con,name);if(find<0){printf("要删除的联系人数据不存在!\n);return;}//要删除的联系人存在-->知道了要删除的联系人数据对应的下标SLErase(con,find);printf("删除成功!\n"); 
} //展示通讯录数据
void ContactShow(Contact* con) 
{//表头:姓名 性别 年龄 电话 地址printf("%s %s %s %s %s\n","姓名","性别","年龄","电话","地址");for(int i=0;i<con->size;i++){printf("%s %s %d %s %s\n",con->arr[i].nme,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}//通讯录的修改         
void ContactModify(Contact*con)
{
//要修改的联系人数据存在char name[NAME_MAX];printf("请输入要修改的用户姓名:\n");scanf("%s",nmae);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("%s",con->arr[find].tel);printf("请输入新的地址:\n");scanf("%s",con->arr[find].addr);printf("修改成功!\n)";}
//通讯录查找
void ContactFind(Contact* con)
{//姓名 性别 年龄 电话 地址//11    11   11  11  11char name[NAME_Max];printf("%s",name);int find=FindByName(con,name);if(find<0){printf("要修改的联系人数据不存在!\n);return;}//手动调整格式printf("%s %s %s %s %s\n","姓名","性别","年龄","电话","地址");printf("%s %s %d %s %s\n",con->arr[find].nme,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);

通讯录的测试方法

void ContactTest()
{Contact con;//创建通讯录对象,实际上就是顺序表对象,等价于SL s1ContactInit(&con);
}

test.c

void  menu()
{printf("**************************************");printf("****1.增加联系人       2.删除联系人*****");printf("****3.修改联系人       4.查找联系人*****");printf("*****5.展示联系人      0.退出***********");printf("**************************************");
}
int main()
{int op=-1;Contact con;ContactInit(&con);do{menu();printf("请选择您的操作:\n");scanf("%d",&op);switch(op){case 1:ContactAdd(&con);case 2:ContactDel(&con);case 3:ContactModify(&con);case 4:ContactFind(&con);case 5:ContactShow(&con);case 0:printf("退出通讯录!\n);break;default:printf("输入错误,请重新输入!\n);break;}while(op!=0)ContactDestory(&con);return 0;
}

如何保证程序结束后,历史通讯录信息不会丢失:

void SaveContact(contact* con){FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("fopen error!\n");return;}
//将通讯录数据写⼊⽂件for (int i = 0; i < con->size; i++){fwrite(con->a + i, sizeof(PeoInfo), 1, pf);}printf("通讯录数据保存成功!\n");
}


 

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

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

相关文章

嵌入式中基于QT的开源串口调试工具

大家好,今天分享一个基于QT设计串口调试工具,源码在Gitee,代码简单,可操作性强! https://gitee.com/ErichMoonan/serial-master1、概述 在开始软件设计之前,我们来简略地分析一下这样一个小软件其要包含的主要内容有哪些。我们认为软件需要如下几个方面的内容: 串口参…

使用阿里云试用Elasticsearch学习:2.1 深入搜索——结构化搜索

结构化搜索&#xff08;Structured search&#xff09; 是指有关探询那些具有内在结构数据的过程。比如日期、时间和数字都是结构化的&#xff1a;它们有精确的格式&#xff0c;我们可以对这些格式进行逻辑操作。比较常见的操作包括比较数字或时间的范围&#xff0c;或判定两个…

jetlinks

学习笔记 设备消息协议解析SDK 平台封装了网络通信,但是具体的数据由消息协议进行解析.协议(ProtocolSupport)主要由认证器(Authenticator), 消息编解码器(DeviceMessageCodec),消息发送拦截器(DeviceMessageSenderInterceptor)以及配置元数据(ConfigMetadata)组成. 2. demo里…

Java Web这一路走来

大部分Java应用都是Web或网络应用&#xff0c;MVC框架在Java框架中有着举足轻重的地位&#xff0c;一开始的Web应用并不现在这样子的&#xff0c;一步一步走来&#xff0c;每一步都经历了无数的血和泪的教训&#xff0c;以史为镜可以知兴替。 1. 草莽时代 早期的Java服务端技…

Flutter开发之图片选择器

使用FLutter开发了一个图片选择的组件&#xff0c;功能如下&#xff1a; 1、支持设置最大可选图片的个数&#xff1b; 2、根据选择的图片个数自适应容器组件的高度&#xff1b; 3、可设置容器的最大高度&#xff1b; 4、支持点击放大和删除功能&#xff1b; 具体效果如下 …

【代码随想录算法训练营第四十六天 | LeetCode139.单词拆分】

代码随想录算法训练营第四十六天 | LeetCode139.单词拆分 一、139.单词拆分 解题代码C&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vecto…

HarmonyOS4.0 ArkTS基本语法

一、项目目录结构 二、HelloWorld 当我们创建一个新的page时&#xff0c;IDE会给我们生成一个HelloWorld的模板 新建page 开启预览器 三、ArkTS基本组成 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中Entry、Component…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间&#xff0c;可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制&#xff0c;所能表示的IP 地址个数为 2^32 4 294 967 29640 亿&#xff0c;因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

LeetCode 216. 组合总和 III

解题思路 dfs,和全排列的写法类似。 相关代码 class Solution {int a[] new int[9];List<Integer> path new ArrayList<>();boolean st[] new boolean[10];List<List<Integer>> res new ArrayList<>();public List<List<Integer>…

Samba实现windows和Linux共享文件,环境搭建

​ 搭建步骤 安装sambad sudo apt-get install samba samba-common 创建samba用户和密码 此处使用 Linux 账号和密码作为 samba 的账号和密码。Linux 账号为 shelmean shelmeanmachine:[~] $ sudo smbpasswd -a shelmean New SMB password: Retype new SMB password: Add…

【算法】环形链表

题目 给定一个链表&#xff0c;判断链表中是否有环&#xff0c;并返回结果。 原理 遍历 声明一个Set&#xff0c;遍历链表放入Set&#xff0c;如果放入失败&#xff0c;说明有环。 双指针 声明一个快指针和一个慢指针&#xff0c;快指针每次移动两步&#xff0c;慢指针移…

从唯一序列码、单例模式到集群的思考

唯一序列码 在做实际业务开发中&#xff0c;不定时需要用到序列号的生成&#xff0c;要求为唯一序列码。 在实际的实现过程中&#xff0c;我常用的是两种方式&#xff1a;1、数据库自增序列&#xff1b;2&#xff1a;uuid. 如果是采用了mysql数据库&#xff0c;使用自带的数…

Qt快速入门到熟练(3.程序运行发布与设置图标)

程序运行发布 当我们执行过qt过后&#xff0c;将会在项目目录里面生成出一个debug构建目录&#xff0c;点击进去选择debug文件夹&#xff0c;就可以看到我们生成出来的可执行文件。 很显然我们的项目就叫做MyFirstWidget&#xff0c;所以生成的可执行文件在没有人为设置的情…

idea链接gitlab的token到期

报错 HTTP Request Request GET http://36.46.143.158:6060/api/v4/version failed wit

基于javaJSPssm实现的交通档案管理系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

LVS NAT、DR、FULL-NAT 模式介绍

NAT模式 NAT模式下的转发流程 1. CIP ---> VIP 当请求达到调度器时&#xff0c;此时请求会先达到PREROUTING链&#xff0c;这个时候源IP为CIP 目标IP为VIP 2. CIP ---> RIP 当内核检测到访问的IP是本机是&#xff0c;会将数据包发送到INPUT链&#xff0c;IPVS检测到数…

VM虚拟机部署code-server服务+tailscale内网穿透,实现随处coding

1.Linux下安装code-server Releases coder/code-server (github.com)https://github.com/coder/code-server/releases先去发布页面查看最新的code-server版本&#xff0c;下载命令示例&#xff1a; wget https://github.com/coder/code-server/releases/download/v4.22.1/co…

【操作系统】STM32-操作系统——持续更新

【操作系统】STM32-操作系统——持续更新 文章目录 前言一、ucosii二、freertos1.介绍2.移植 总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、ucosii UCOSII移植到STM32F103C8T6上之移植记录&#xff08;一&#xff09; UCOSII移植到ST…

物联网实战--入门篇之(九)安卓QT--开发框架

目录 一、QT简介 二、开发环境 三、编码风格 四、设计框架 五、总结 一、QT简介 QT是一款以C为基础的开发工具&#xff0c;已经包含了很多常用的库&#xff0c;除了基本的GUI以外&#xff0c;还有网络、数据库、多媒体、进程通信、串口、蓝牙等常用库&#xff0c;开发起来…

万字长文,大数据PowerBI面试题及参考答案

1. 如何在PowerBI中创建计算列? 在PowerBI中,计算列是通过对现有数据应用公式来创建的新列。这允许用户进行更复杂的数据分析和数据准备。以下是创建计算列的基本步骤: 打开PowerBI Desktop。在“数据”选项卡中,选择“新建列”。输入新列的名称,并在公式栏中编写DAX公式…