顺序表的应用——通讯录

通讯录的实现分为五个文件分别进行编写,分别为: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://xiahunao.cn/news/3246404.html

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

相关文章

深度学习驱动智能超材料设计与应用

在深度学习与超材料融合的背景下&#xff0c;不仅提高了设计的效率和质量&#xff0c;还为实现定制化和精准化的治疗提供了可能&#xff0c;展现了在材料科学领域的巨大潜力。深度学习可以帮助实现超材料结构参数的优化、电磁响应的预测、拓扑结构的自动设计、相位的预测及结构…

自学鸿蒙HarmonyOS的ArkTS语言<十>@BuilderParam装饰器

作用&#xff1a;当子组件多处使用时&#xff0c;给某处的子组件添加特定功能 一、初始化 1、只能被Builder装饰的方法初始化 2、使用所属自定义组件的builder方法初始化 3、使用父组件的builder方法初始化 - 把父组件的builder传过去&#xff0c;参数名和子组件的builderPar…

SpringCloud教程 | 第十篇: 读取Nacos的配置

1、nacos服务器选用 2、test.yaml这一个DataId配置如下&#xff1a; config:name: aabb222 spring:application:name: testdatasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/hmblogs?useUni…

JuiceFS缓存特性

缓存 对于一个由对象存储和数据库组合驱动的文件系统&#xff0c;缓存是本地客户端与远端服务之间高效交互的重要纽带。读写的数据可以提前或者异步载入缓存&#xff0c;再由客户端在后台与远端服务交互执行异步上传或预取数据。相比直接与远端服务交互&#xff0c;采用缓存技…

HTML的简单应用 标记信件

前言&#xff1a; 暑假开始了&#xff0c;我也要正式开始学习web的相关知识了&#xff0c;先从三大件的html开始吧&#xff0c;目前只简单了解了html相关知识的基础&#xff0c;能写一些包含一些文字和图片的简单网页&#xff0c;其实会的东西还是不多&#xff0c;这边看书时发…

etcd的备份与恢复

一 为什么使用etcd 与ZooKeeper相比&#xff0c;etcd更简单&#xff0c;安装、部署和使用更加容易&#xff0c;并且etcd的某些功能是ZooKeeper所没有的。因此&#xff0c;在很多场景下&#xff0c;etcd 比ZooKeeper更受用户的青&#xff0c;具体表现在如下几个方面: 1 etcd更…

字节跳动十年经验老鸟,耗时大半年整理的软件测试面试真题【附答案】

软件测试工程师&#xff0c;和开发工程师相比起来&#xff0c;虽然前期可能不会太深&#xff0c;但是涉及的面还是比较广的。前期面试实习生或者一年左右的岗位&#xff0c;问的也主要是一些基础性的问题比较多。涉及的知识主要有MySQL数据库的使用、Linux操作系统的使用、软件…

操作系统详解之进程管理

一、进程 1.1 多道程序设计 允许多个程序同时进入内存并运行&#xff0c;提高CPU的利用率&#xff0c;目的是提高系统效率 a图内存中有四个程序&#xff0c;串行执行&#xff0c;因为这里只有一个程序计数器。 当有了多道程序技术之后就得到了b图&#xff0c;每个程序各自独立…

电脑显示mfc140u.dll丢失的修复方法,总结7种有效的方法

mfc140u.dll是什么&#xff1f;为什么电脑会出现mfc140u.dll丢失&#xff1f;那么mfc140u.dll丢失会给电脑带来什么影响&#xff1f;mfc140u.dll丢失怎么办&#xff1f;今天详细给大家一一探讨一下mfc140u.dll文件与mfc140u.dll丢失的多种不同解决方法分享&#xff01; 一、mfc…

C++初学者指南-5.标准库(第一部分)--容器遍历

C初学者指南-5.标准库(第一部分)–容器遍历 文章目录 C初学者指南-5.标准库(第一部分)--容器遍历前向遍历基于范围的循环for_each / for_each_n迭代器的显式使用基于索引的循环 逆向遍历反向范围循环(C20)反向 for_each / for_each_n反向迭代器的显式使用基于索引的反向循环…

k8s核心操作_存储抽象_K8S中使用Secret功能来存储密码_使用免密拉取镜像_k8s核心实战总结---分布式云原生部署架构搭建033

注意在看的时候一定要把 dxxxx中的xxxx换成--o----c----k----e----r 然后我们再来看一个k8s中的secret的功能,这个功能 用来存储密码的,configMap是用来存配置的 比如我们有个pod,他的镜像,如果是需要密码的,那么 我们现在是从公共仓库拉取的,如果我们从私有仓库拉取,有密码…

18_Shell好用工具:sort

18_Shell好用工具&#xff1a;sort 选项说明-k指定要排序的列-nnumber&#xff0c;按照数值大小排序-rreverse&#xff0c;逆序-t分隔符-u去重-o保存排序到文件 一、数字升序 #sort1.txt文件纯数字 #升序 sort -n sort1.txt #降序 sort -nr sort1.txt二、数字升序去重 #数字…

Java SpringAOP简介

简介 官方介绍&#xff1a; SpringAOP的全称是&#xff08;Aspect Oriented Programming&#xff09;中文翻译过来是面向切面编程&#xff0c;AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是Spring框架中的一个重要内容&#xff0c;是函数式编程的一种衍生…

【前端7*】表格-表单2(弹窗在子组件)父子组件调用 vue element-ui

vue element-ui 中表单弹框的使用 写在最前面一、子组件 HelloWorld.vue1. 弹窗部分、将 visible 传值给父组件2.表单的 ruleForm 校验方法3.表单确认方法4. 提交确认方法&#xff1a;handleSummit5.表单渲染 二、父组件 HomeView.vue1.新增按钮、查看和编辑2.引用子组件弹窗3.…

强化学习——多臂老虎机问题(MAB)【附python代码】

文章目录 一、问题描述1.1 问题定义1.2 形式化描述1.3 累积懊悔1.4 估计期望奖励 二、解决方法2.1 ϵ-贪婪算法2.2 上置信界算法2.3 汤普森采样算法2.4 小结 一、问题描述 1.1 问题定义 有一个用于 K 根拉杆的老虎机&#xff0c;每一根拉杆都对应一个关于奖励的概率分布 R 。每…

Python项目实战之-爬取全网小说资源

python爬虫实战-小说爬取 基于requests模块与lxml模块编写的爬虫 基本思路 主要内容分为三个部分 使用requests模块获取网页内容使用lxml模块进行网页解析将解析出来的数据存储进MySQL数据库中 获取网页内容 网站分析 获取各个分类的href标签 代码如下 def novel_sort…

JMeter接口测试之文件上传(参数提取与传递)

参考文档&#xff1a; Jmeter接口测试-文件上传&#xff08;全网最详细的教程&#xff09;_jmeter 文件上传-CSDN博客 1、首先通过fiddler抓取文件上传接口&#xff0c;在Raw的tab页中查看默认请求头以及请求参数 如图所示 2、在jmeter中导入抓取的接口&#xff0c;首先需要配…

ctfshow~菜狗杯 损毁的压缩包

题目给了一个.zip的压缩包&#xff0c;解压报错 用010Editor打开看一下&#xff0c;发现文件头是png的 把文件后缀改成png看一下&#xff0c;得到flag ctfshow{e19efe2eb86f10ccd7ca362110903c05}

【生命游戏】python刷题记录

目录 题目&#xff1a; 代码&#xff1a; 结果&#xff1a; 总结&#xff1a; 题目&#xff1a; 代码&#xff1a; class Solution:def gameOfLife(self, board: List[List[int]]) -> None:"""Do not return anything, modify board in-place instead.&…

rocky9.3操作系统安装记录

文章目录 一、镜像源二、安装的过程选择安装过程中语言安装信息摘要页面设置安装目的地设置管理员密码调整网络开始部署 一、镜像源 Rocky-9.3-x86_64-minimal.iso 二、安装的过程 选择安装过程中语言 安装信息摘要页面 设置安装目的地 不做操作&#xff0c;直接使用自动分…