顺序表的应用——通讯录

通讯录的实现分为五个文件分别进行编写,分别为:SeqList.c,SeqList.h,Contact.c,Contact.h,test.c
其中前两个文件为上一篇博客中的顺序表的操作后三个文件为通讯录功能的实现

  • SeqList.h
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef CInfo SLDataType;//将数据类型改变为struct,从而实现通讯录的存储效果
typedef struct SeqList
{SLDataType* a;int size;int capacity;
}SL;void SLInit(SL* ps);//顺序表的初始化void SLDestroy(SL* ps);//顺序表的销毁void SLPushBack(SL* ps, SLDataType x);//顺序表的尾插void SLPushFront(SL* ps, SLDataType x);//顺序表的头插void SLPopBack(SL* ps);//顺序表的尾删bool SLIsEmpty(SL* ps);//判断顺序表是否为空void SLPopFront(SL* ps);顺序表的头删void SLInsert(SL* ps, int pos, SLDataType x);//顺序表任意位置的插入void SLErase(SL* ps, int pos);//顺序表任意位置的删除
  • SeqList.c
#include"SeqList.h"void SLInit(SL* ps)
{ps->a = NULL;ps->size = ps->capacity = 0;
}void SLDestroy(SL* ps)
{if (ps->a)free(ps);ps->a = NULL;ps->size = ps->capacity = 0;
}void SLPushBack(SL* ps, SLDataType x)
{assert(ps);int newcapacity = ps->capacity == 0 ? 4 : ps->capacity;if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * 2 * sizeof(SLDataType));if (tmp == NULL){perror("errno\n");}ps->a = tmp;ps->capacity *= 2;}ps->a[ps->size] = x;ps->size++;
}void SLPushFront(SL* ps, SLDataType x)
{assert(ps);if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDataType));if (tmp == NULL){perror("errno\n");}ps->a = tmp;ps->capacity *= 2;}for (size_t i = ps->size; i > 0; i--){ps->a[i] = ps->a[i - 1];}ps->a[0] = x;ps->size++;
}bool SLIsEmpty(SL* ps)
{assert(ps);return ps->size == 0;
}void SLPopBack(SL* ps)
{assert(ps);assert(SLIsEmpty(ps));ps->size--;
}void SLPopFront(SL* ps)
{assert(ps);assert(SLIsEmpty(ps));for (int i = 0; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDataType));if (tmp == NULL){perror("errno\n");}ps->a = tmp;ps->capacity *= 2;}for (int i = ps->size; i > pos; i--){ps->a[i] = ps->a[i - 1];}ps->a[pos] = x;ps->size++;
}void SLErase(SL * ps, int pos)
{assert(ps);assert(!SLIsEmpty(ps));assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}
  • test.c
#include"SeqList.h"
#include"Contact.h"void menu()
{printf("*************     通讯录     ************\n");printf("******1.增加联系人    2.删除联系人*******\n");printf("******3.修改联系人    4.查找联系人*******\n");printf("******5.查看通讯录    0.退出      *******\n");printf("*****************************************\n");
}int main()
{contact con;ContactInit(&con);int input = 0;do{menu();printf("请输入操作的编号:\n");scanf("%d",&input);switch (input){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContcatModify(&con);break;case 4:Contactfind(&con);break;case 5:Contactshow(&con);break;case 0:printf("已退出\n");break;default:printf("请输入正确的操作序号\n");break;}} while (input);return 0;
}

打印目录,让使用通讯录的人通过输入的数字来实现相对应的操作
在这里插入图片描述

  • Contact.h
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 20
#define MAX_ADDR 20typedef struct ContactInfo
{char name[MAX_NAME];char sex[MAX_SEX];int age;char tele[MAX_TELE];char addr[MAX_ADDR];
}CInfo;typedef struct SeqList contact;void ContactInit(contact* pcon);//通讯录的初始化void ContactDestory(contact* pcon);//通讯录的销毁void ContactAdd(contact* pcon);//通讯录联系人的增加void ContactDel(contact* pcon);//通讯录联系人的删除void ContcatModify(contact* pcon);//通讯录联系人的修改void Contactshow(contact* pcon);//通讯录联系人的展示void Contactfind(contact* pcon);//通讯录联系人的查找
  • Contact.c
#include"Contact.h"
#include"SeqList.h"void ContactInit(contact* pcon)
{SLInit(pcon);
}

通讯录的初始化操作同顺序表的初始化操作

void ContactDestory(contact* pcon)
{SLDestroy(pcon);
}

通讯录的销毁操作同顺序表的销毁操作

void ContactAdd(contact* pcon)
{CInfo info;printf("请输入联系人的姓名:\n");scanf("%s",info.name);printf("请输入联系人的性别:\n");scanf("%s", info.sex);printf("请输入联系人的年龄:\n");scanf("%d", &info.age);printf("请输入联系人的电话:\n");scanf("%s", info.tele);printf("请输入联系人的住址:\n");scanf("%s", info.addr);SLPushBack(pcon, info);
}

通讯录增加联系人的操作需要提前将联系人的信息存储到一个新建的结构体中,再将结构体尾插入通讯录中

int FindByName(contact* pcon, char name[])
{for (int i = 0; i < pcon->size; i++){if (strcmp(pcon->a[i].name, name) == 0)return i;}return -1;
}

查找联系人是否存在的操作(以姓名为例)只需将联系人的姓名与待查找人的姓名进行对比即可

void ContactDel(contact* pcon)
{printf("请输入要删除联系人的姓名\n");char input[MAX_NAME];scanf("%s",input);int find = FindByName(pcon, input);if (find < 0){printf("待删除的联系人不存在\n");return;}SLErase(pcon, find);
}
  1. 查找联系人是否存在
  2. 删除联系人
void ContcatModify(contact* pcon)
{printf("请输入要修改的联系人的姓名\n");char input[MAX_NAME];scanf("%s", input);int find = FindByName(pcon, input);if (find < 0){printf("待修改的联系人不存在\n");return;}printf("请输入修改后的联系人姓名\n");scanf("%s",pcon->a[find].name);printf("请输入修改后的联系人性别\n");scanf("%s",pcon->a[find].sex);printf("请输入修改后的联系人年龄\n");scanf("%d",&pcon->a[find].age);printf("请输入修改后的联系人电话\n");scanf("%s", pcon->a[find].tele);printf("请输入修改后的联系人地址\n");scanf("%s", pcon->a[find].addr);printf("修改成功\n");
}
  1. 查找联系人是否存在
  2. 修改联系人的信息
void Contactshow(contact* pcon)
{printf("%s %s %s %s %s\n","姓名","性别","年龄","电话","住址");for (int i = 0; i < pcon->size; i++){printf("%-4s %-4s %-4d %-4s %-4s\n",pcon->a[i].name,pcon->a[i].sex,pcon->a[i].age,pcon->a[i].tele,pcon->a[i].addr);}
}

从头遍历顺序表,并对数据进行打印

void Contactfind(contact* pcon)
{printf("请输入待查找的联系人姓名\n");char input[MAX_NAME];scanf("%s",input);int find = FindByName(pcon, input);if (find < 0){printf("待查找的联系人不存在\n");return;}printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "住址");printf("%-4s %-4s %-4d %-4s %-4s\n",pcon->a[find].name,pcon->a[find].sex,pcon->a[find].age,pcon->a[find].tele,pcon->a[find].addr);
}
  1. 查找联系人是否存在
  2. 存在则输出相关联系人数据

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

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

相关文章

jenkins系列-07.轻易级jpom安装

jpom是一个容器化服务管理工具&#xff1a;在线构建&#xff0c;自动部署&#xff0c;日常运维, 比jenkins轻量多了。 本篇介绍mac m1安装jpom: #下载&#xff1a;https://jpom.top/pages/all-downloads/ 解压&#xff1a;/Users/jelex/Documents/work/jpom-2.10.40 启动前修…

Ubuntu上安装配置samba服务

Ubuntu上安装配置samba服务 在Ubuntu中安装配置samba共享服务&#xff0c;可以让你在网络上共享文件和打印机。以下是一个相对详细的步骤指南&#xff0c;介绍如何在Ubuntu上安装和配置Samba。 1. 安装Samba 首先&#xff0c;需要安装Samba软件包。打开终端并运行以下命令&a…

在SpringCloud中如何轻松实现微服务间的通信

在Spring Cloud中&#xff0c;实现微服务间的通信非常简单。Spring Cloud提供了多种方式来进行微服务之间的通信&#xff0c;包括使用RestTemplate、Feign、Ribbon、Eureka等组件。下面我将详细介绍这些方式的使用方法。 使用RestTemplate进行通信&#xff1a; RestTemplate是S…

Qt 多语言

记录Qt多语言的实现过程 目录 1.项目配置文件.pro配置 2.程序中的字符串用tr()封装 3.生成翻译文件 4.使用Qt语言家修改翻译文件 4.1使用Qt语言家打开 4.2 .更改文件配置 5. 生成qm文件 6.代码执行切换语言 6.1入口处 6.2 事件执行 0.效果 1.项目配置文件.pro配置 T…

2024年【天津市安全员C证】免费试题及天津市安全员C证考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证免费试题根据新天津市安全员C证考试大纲要求&#xff0c;安全生产模拟考试一点通将天津市安全员C证模拟考试试题进行汇编&#xff0c;组成一套天津市安全员C证全真模拟考试试题&#xff0c;学员可通过…

【C++刷题】[UVA 489]Hangman Judge 刽子手游戏

题目描述 题目解析 这一题看似简单其实有很多坑&#xff0c;我也被卡了好久才ac。首先题目的意思是&#xff0c;输入回合数&#xff0c;一个答案单词&#xff0c;和一个猜测单词&#xff0c;如果猜测的单词里存在答案单词里的所有字母则判定为赢&#xff0c;如果有一个字母是答…

docker安装nginx并配置https

参考 docker安装nginx并配置https-腾讯云开发者社区-腾讯云 (tencent.com) 证书的生成 参见&#xff1a;SpringBoot项目配置HTTPS接口的安全访问&#xff08;openssl配置&#xff09;_配置接口访问-CSDN博客 步骤 1: 拉取Nginx镜像 docker pull nginx 好使的镜像如下&#x…

「漏洞复现」同享人力资源管理系统-TXEHR V15 DownloadTemplate 文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

权威认可 | 海云安开发者安全助手系统通过信通院支撑产品功能认证并荣获信通院2024年数据安全体系建设优秀案例

近日&#xff0c;2024全球数字经济大会——数字安全生态建设专题论坛&#xff08;以下简称“论坛”&#xff09;在京成功举办。由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院及公安部第三研究所共同承办&#xff0c;论坛邀请多位专家和企业共同参与。 会上颁发…

Python JSON处理:兼容性与高级应用

JSON&#xff08;JavaScript Object Notation&#xff09;作为当前最流行的数据传输格式&#xff0c;在Python中也有多种实现方式。由于JSON的跨平台性和简便易用性&#xff0c;它在数据交互中被广泛应用。本文将重点讨论如何熟练应用Python的JSON库&#xff0c;将JSON数据映射…

STM32智能交通灯系统教程

目录 引言环境准备智能交通灯系统基础代码实现&#xff1a;实现智能交通灯系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;交通管理与优化问题解决方案与优化收尾与总结 1. 引言 智能交通灯系统通过STM…

数据精度丢失

js数据精度丢失 最近看面试题想到了之前在开发钟遇到过的问题&#xff0c;现总结一下 在开发过程中&#xff0c;发现从后台返回的数据结构中的id字段在前端显示为不正确的值。经过排查&#xff0c;怀疑是JavaScript中Number类型精度丢失的问题。通过将id字段的类型从Number改为…

朴素模式匹配算法与KMP算法(非重点)

目录 一. 朴素模式匹配算法1.1 什么是字符串的匹配模式1.2 朴素模式匹配算法1.3 通过数组下标实现朴素模式匹配算法 二. KMP算法2.1 算法分析2.2 用代码实现&#xff08;只会出现在选择题&#xff0c;考察代码的概率不大&#xff09; 三. 手算next数组四. KMP算法的进一步优化4…

pdf工具

iLovePDF | 为PDF爱好者提供的PDF文件在线处理工具 https://www.ilovepdf.com/zh-cn 图片 pdf 合并成一个pdf也可以拆分

工业三防平板可优化工厂流程管理

在当今高度自动化和数字化的工业生产环境中&#xff0c;工业三防平板正逐渐成为优化工厂流程管理的关键工具。其强大的功能和卓越的性能&#xff0c;为工厂带来了更高的效率、更低的成本以及更出色的质量控制。 工业三防平板&#xff0c;顾名思义&#xff0c;具备防水、防尘、防…

【持续集成_06课_Jenkins高级pipeline应用】

一、创建项目选择pipeline的风格 它主要是以脚本&#xff08;它自己的语言&#xff09;的方式进行运行&#xff0c;一般由运维去做的事情&#xff0c;作为测试而言。了解即可。 --- 体现形式全部通过脚本去实现&#xff1a;执行之前&#xff08;拉取代码&#xff09;执行&…

萝卜快跑:未来出行的双刃剑

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 在这个日新月异的科技时代&#xff0c;无人驾驶技术正以前所未有的速度改变着我们的出行方式。萝卜快跑&#xff0c;作为自动驾驶出租车领域的佼佼者&#xff0c;其出现无疑为城市交通注入了新的活力&#xff…

入坑树莓派(2)——树莓派4B与手机蓝牙通信

入坑树莓派(2)——树莓派4B与手机蓝牙通信 1、引言 在入坑树莓派(1)中已经搞掂了可视化问题。现在继续开展下一步,尝试与手机通信,一开始是想弄wifi连接的,但发现基于wifi的APP比较难弄,为了降低开发的难度,又因为树莓派板子自带蓝牙模块,所以直接选用蓝牙连接手机…

【数据结构】队列

目录 队列队列的模拟实现队列的链式实现接口实现内部类入队列出队列获取队头元素 但是不删除 判空获取队列元素个数 队列的顺序实现&#xff08;循环队列&#xff09;直接使用顺序表的缺陷接口实现成员变量构造器&#xff0c;设置队列长度为 k向循环队列插入一个元素 成功插入则…

IMU用于针对帕金森患者的去震颤餐勺

近期&#xff0c;一项由土耳其科研人员开发的创新成果FiMec智能防颤勺子&#xff0c;为手部震颤患者带来了福音。这款设备运用先进的振动抑制技术和精密的机器人设计&#xff0c;旨在帮助因神经肌肉系统障碍而遭受手颤困扰的人士实现自主进食。 FiMec智能勺子采用两自由度设计…