当前位置: 首页 > news >正文

C语言——通讯录的实现

一.前言

嗨嗨嗨,又和大家见面了!前面我们讲到了如何实现一个循序表。现在我们开始讲解如何基于循序表来实现通讯录功能。

二.正文

通讯录中的SeqlList.h

#pragma once
//#define SLDateType int
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Contact.h"
typedef PerInfo SLDateType;//通讯录中SeqList.h与顺序表中SeqList.h的区别只是在通讯录中将int换成了结构体PerInfo
typedef struct SeqList
{SLDateType* arr;int size;int capacity;
}SL;
void SLInit();//循序表的初始化
void SLDestroy();//顺序表的销毁
void SLPushBack();//尾部插入
void SLPushFront();//头部插入
void SLPopBack();//尾部删除
void SLPopFront();//头部删除
void SLInsert();//指定位置插入
void SLErase();//指定位置删除
int SLFind();//查找数据

通讯录中的Contact.h

#pragma once
#define NAME_MAX 20
#define GENDER_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 20
typedef struct PersonInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}PerInfo;
typedef struct SeqList Contact;
void ContactInit(Contact* con);//通讯录的初始化
void ContactDestroy();//通讯录的销毁
void ContactAdd();//通讯录添加数据
void ContactDel();//通讯录删除数据
void ContactModify();//通讯录修改数据
int ContactFind();//通讯录查找数据
void ContactShow();//通讯录展示数据

通讯录中的SeqList.c

#include"SeqList.h"
void SLInit(SL* ps)//循序表的初始化函数的实现
{ps->arr = NULL;ps->size = ps->capacity = 0;
}
void SLDestroy(SL* ps)//顺序表销毁的函数实现
{if ((ps->arr) != NULL){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){int NewCapacity = ps->capacity == 0 ? 6 : 2 * ps->capacity;SLDateType* tmp = (SLDateType*)realloc(ps->arr, NewCapacity * sizeof(SLDateType));if (tmp == NULL){perror("realloc faile!");return ;}ps->arr = tmp;ps->capacity = NewCapacity;}}
//void SLPrint(SL* ps)
//{
//	for (int i = 0; i < ps->size; i++)
//	{
//		printf("%d ", ps->arr[i]);
//	}
//	printf("\n");
//}
//void SLPrint(SL s)
//{
//	for (int i = 0; i <s .size; i++)
//	{
//		printf("%d ", s.arr[i]);
//	}
//	printf("\n");
//}
void SLPushBack(SL* ps, SLDateType x)//尾插函数的实现
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size] = x;ps->size++;
}
void SLPushFront(SL* ps, SLDateType x)//头插函数的实现
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;
}
void SLPopBack(SL* ps)//尾删函数的实现
{assert(ps);assert(ps->size);ps->size--;
}
void SLPopFront(SL* ps)//头删函数的实现
{for (int i = 0; i < (ps->size) - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}
void SLInsert(SL* ps, int pos, SLDateType x)//指定位置的插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);for (int i = ps->size; i >= pos + 1; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos; i <= ps->size - 2; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}
//int SLFind(SL* ps, SLDateType x)
//{
//	assert(ps);
//	for (int i = 0; i <ps-> size; i++)
//	{
//		if (ps->arr[i] ==x)
//		{
//			return i;
//		}
//	}
//	return -1;
//}

通讯录中的Contact.c

#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
#include"SeqList.h"
#include"Contact.h"
#include<string.h>
void ContactInit(Contact* con)
{SLInit(con);}
void ContactDestroy(Contact* con)
{SLDestroy(con);
}void ContactAdd(Contact* con)
{PerInfo pf;printf("请输入用户的姓名\n");scanf("%s", pf.name);printf("请输入用户的性别\n");scanf("%s", pf.gender);printf("请输入用户的年龄\n");scanf("%d", &pf.age);printf("请输入用户的电话\n");scanf("%s", pf.tel);printf("请输入用户的地址\n");scanf("%s", pf.addr);SLPushBack(con, pf);
}int ContactFind(Contact* con,char name[]){for (int i = 0; i < con->size; i++){if (0==strcmp(con->arr[i].name, name)){return i;}}return -1;}void ContactDel(Contact* con){char name[NAME_MAX];printf("请输入你要删除的联系人姓名\n");scanf("%s", name);int find = ContactFind(con, name);if (find < 0){printf("没有找到该联系人\n");ContactShow(con);return;}else{SLErase(con, find);printf("删除成功\n");return;}}void ContactShow(Contact* con){printf("姓名  ");printf("性别  ");printf("年龄  ");printf("电话  ");printf("地址  ");printf("\n");for (int i = 0; i < con->size; i++){printf("%s ",con->arr[i].name);printf("%s ", con->arr[i].gender);printf("%d ", con->arr[i].age);printf("%s ", con->arr[i].tel);printf("%s ", con->arr[i].addr);printf("\n");}}void ContactModify(Contact* con){char name[NAME_MAX];printf("输入要修改人姓名\n");scanf("%s", name);int find = ContactFind(con, name);if (find < 0){printf("要修改的联系人数据不存在!\n");ContactShow(con);return;}//直接修改printf("请输入新的姓名:\n");scanf("%s", con->arr[find].name);printf("请输入新的性别:\n");scanf("%s", con->arr[find].gender);printf("请输入新的年龄:\n");scanf("%d", &con->arr[find].age);printf("请输入新的电话:\n");scanf("%s", con->arr[find].tel);printf("请输入新的住址:\n");scanf("%s", con->arr[find].addr);printf("修改成功!\n");}

测试通讯录功能test.c

//#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
#include"Contact.h"
int main()
{//SL sl;//SLInit(&sl);//SLPushBack(&sl, 0);//SLPushBack(&sl, 1);//SLPushBack(&sl, 2);//SLPushBack(&sl, 3);//SLPushFront(&sl, 3);
//	SLPushFront(&sl, 4);//SLPopBack(&sl);
//	SLPopFront(&sl);// SLInsert(&sl, 3, 99);//SLErase(&sl, 1);/*SLFind(&sl, 2);SLPrint(&sl);int find = SLFind(&sl, 2);if (find < 0){printf("没有找到\n");}else{printf("找到了,该数据下标是%d\n", find);}*/Contact Con;ContactInit(&Con);ContactAdd(&Con);ContactAdd(&Con);//ContactShow(&Con);ContactDel(&Con);ContactDestroy(&Con);return 0;
}

三.结言

今天的分享结束,下次再见了同学们!

相关文章:

C语言——通讯录的实现

一.前言 嗨嗨嗨&#xff0c;又和大家见面了&#xff01;前面我们讲到了如何实现一个循序表。现在我们开始讲解如何基于循序表来实现通讯录功能。 二.正文 通讯录中的SeqlList.h #pragma once //#define SLDateType int #include<stdio.h> #include<stdlib.h> #…...

Next-Scale Prediction、InstantStyle、Co-Speech Gesture Generation

本文首发于公众号&#xff1a;机器感知 Next-Scale Prediction、InstantStyle、Co-Speech Gesture Generation Visual Autoregressive Modeling: Scalable Image Generation via Next-Scale Prediction We present Visual AutoRegressive modeling (VAR), a new generation p…...

class中 padding和margin的用法;

如果我们想要移动盒子等的位置 &#xff0c;除了可以用相对定位和绝对定位还可以用margin 和paddinng&#xff1b; 结构如图所示 margin和padding的用法&#xff1a; padding和margin后面可以跟1或2或3或4个数&#xff0c;按照顺序分别是上&#xff0c;右&#xff0c;下&…...

单独使用YOLOV9的backbone网络

前言 YOLO系列的网络结构都是通过.yaml来进行配置的,当要单独想使用其中的backbone网络时,可以通过yaml配置文件来进行网络搭建。 backbone的yaml配置文件与网络结构 backbone:[[-1, 1, Silence, []], # conv<...

WordPress JS Support Ticket插件 RCE漏洞复现

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。JS Support Ticket是使用在其中的一套开源票务系统插件。 0x02 漏洞概述 WordPress中的JS Support Ticket插件存在未经上传漏洞,未经身份验证的攻击者可以上传恶意脚本的服务器,执行任意指令,从而获…...

加盟代理短视频无人直播项目,开启互联网线上经营新模式

随着短视频行业的快速发展和用户数量的不断增长&#xff0c;短视频无人直播项目成为了近年来备受关注的创业机会。本文将分享如何加盟代理短视频无人直播项目&#xff0c;开启属于自己的经营新模式。 一、了解无人直播项目的核心优势 短视频无人直播项目是结合了短视频与直播的…...

spring高级篇(一)

1、ApplicationContext与BeanFactory BeanFactory是ApplicationContext的父级接口&#xff1a;&#xff08;citlaltu查看类关系图&#xff09; 在springboot的启动类中&#xff0c;我们通过SpringApplication.run方法拿到的是继承了ApplicationContext的ConfigurableApplicatio…...

免费的GPT-3.5 API服务aurora

什么是 aurora &#xff1f; aurora 是利用免登录 ChatGPT Web 提供的无限制免费 GPT-3.5-Turbo API 的服务&#xff0c;支持使用 3.5 的 access 调用。 【注意】&#xff1a;仅 IP 属地支持免登录使用 ChatGPT的才可以使用&#xff08;也可以自定义 Baseurl 来绕过限制&#x…...

突破编程_C++_网络编程(Windows 套接字(处理 TCP 粘包问题))

1 TCP 协议与粘包问题概述 1.1 TCP 粘包的产生原因 TCP粘包问题的产生原因涉及多个方面&#xff0c;主要的原因如下&#xff1a; 首先&#xff0c;发送方在发送数据时&#xff0c;由于TCP协议为提高传输效率而采用的Nagle算法&#xff0c;可能会将多个小数据包合并成一个大数…...

【训练营】DateWhale——动手学大模型应用开发(更新中)

文章目录 写在前面大模型简介LLM简介RAG简介LangChain开发框架开发LLM应用的整体流程 写在前面 大模型时代从GPT爆发开始到现在已有一年多了&#xff0c;深度学习发展之快无法想象&#xff0c;一味感叹技术发展速度超越个人学习速度是没用的&#xff0c;倒不如花点时间参加一些…...

【学习笔记十九】EWM Yard Management概述及后台配置

一、EWM Yard堆场管理业务概述 1.Yard Management基本概念 YARD管理针对的是库房以外的区域&#xff0c;可以理解为入大门开始到库门之前的这部分的区域 堆场结构 像在仓库中一样&#xff0c;将相应仓位映射为堆场仓位&#xff0c;可将其分组到堆场分区。场地中可能具有以下结…...

【环境搭建】(五)Ubuntu22.04安装cuda_11.8.0+cudnn_8.6.0

一个愿意伫立在巨人肩膀上的农民...... 设备配置&#xff1a; 一、安装GCC 安装cuda之前&#xff0c;首先应该安装GCC&#xff0c;安装cuda需要用到GCC&#xff0c;否则报错。可以先使用下方指令在终端查看是否已经安装GCC。 gcc --version 如果终端打印如下则说明已经安装…...

【UE5.1】使用MySQL and MariaDB Integration插件——(3)表格形式显示数据

在上一篇&#xff08;【UE5.1】使用MySQL and MariaDB Integration插件——&#xff08;2&#xff09;查询&#xff09;基础上继续实现以表格形式显示查询到的数据的功能 效果 步骤 1. 在“WBP_Query”中将多行文本框替换未网格面板控件&#xff0c;该控件可以用表格形式布局…...

JVM复习

冯诺依曼模型与计算机处理数据过程相关联&#xff1a; 冯诺依曼模型&#xff1a; 输入/输出设备存储器输出设备运算器控制器处理过程&#xff1a; 提取阶段&#xff1a;输入设备传入原始数据&#xff0c;存储到存储器解码阶段&#xff1a;由CPU的指令集架构ISA将数值解…...

63、ARM/STM32中IIC相关学习20240417

完成温湿度传感器数据采集实验。 【思路&#xff1a;1.通过IIC通信原理&#xff0c;理解其通信过程&#xff0c;通过调用封装的IIC函数达成主机和从机之间&#xff1a;起始信号、终止信号、读、写数据的操作&#xff1b; 2.了解温湿度传感器控制芯片SI7006的工作原理&#…...

离岸人民币与人民币国际化

参考 什么是离岸人民币&#xff1f;它有什么用&#xff1f; - 知乎 “人民币就是人民币&#xff0c;为什么要在它前面加上离岸二字&#xff1f;” “既然有离岸人民币&#xff0c;是否有在岸人民币&#xff1f;” 今天我们就简单了解一下什么是离岸人民币。 离岸/在岸人民币…...

Linux平台上部署和运行Ollama的全面指南

Ollama的安装与配置 Ollama提供了一种简单的安装方法&#xff0c;只需一行命令即可完成安装&#xff0c;但是对于想要更深入了解和自定义安装的用户&#xff0c;我们也提供了手动安装的步骤。 快速安装 Ollama的安装极为简单&#xff0c;只需在终端中执行以下命令&#xff1…...

Web---robots协议详解

在Web中&#xff0c;robots协议&#xff08;也称为robots.txt&#xff09;是一种文本文件&#xff0c;用于向搜索引擎机器人&#xff08;通常称为爬虫&#xff09;提供指导&#xff0c;以指示它们哪些页面可以抓取&#xff0c;哪些页面应该忽略。robots.txt文件位于网站的根目录…...

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第四套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第四套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;仅供参考&#xff09;&#xff08;共九套&#xff0c;每套四十个选择题&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadida…...

clipper一些数据结构(入门初识(一))

clipper一些数据结构&#xff08;一&#xff09; Clipper库是一个用于执行多边形裁剪&#xff08;clipping&#xff09;和偏移&#xff08;offsetting&#xff09;操作的开源C库。在Clipper库中&#xff0c;点和多边形&#xff08;polygon&#xff09;是基本的数据结构。Clipp…...

深度探索JD-GUI:Java字节码逆向工程与代码解析实战剖析

深度探索JD-GUI&#xff1a;Java字节码逆向工程与代码解析实战剖析 【免费下载链接】jd-gui A standalone Java Decompiler GUI 项目地址: https://gitcode.com/gh_mirrors/jd/jd-gui 在Java开发与逆向工程领域&#xff0c;Java反编译、字节码分析、代码逆向已成为开发者…...

别再死磕ViT了!用Swin-Transformer搞定高分辨率图像识别,保姆级原理拆解

高分辨率图像识别新范式&#xff1a;Swin-Transformer实战指南 当计算机视觉工程师面对4K医学影像或卫星地图时&#xff0c;传统ViT模型往往会遭遇显存爆炸的尴尬。我曾在一个遥感项目中发现&#xff0c;直接将ViT应用于20482048像素的图像&#xff0c;单次前向传播就消耗了32G…...

别再手动写Prompt了!Lovable原生AI编排引擎深度解析(附12个已验证行业工作流)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Lovable无代码AI应用构建指南 Lovable 是一款面向业务人员与开发者的低门槛 AI 应用构建平台&#xff0c;它通过可视化编排、预置模型组件和自然语言驱动逻辑&#xff0c;实现无需编写代码即可部署可运…...

从MATLAB到FPGA:高效生成三种波形COE文件的实战指南

1. COE文件格式解析与FPGA应用场景 COE文件是Xilinx FPGA设计中用于初始化Block RAM&#xff08;BRAM&#xff09;的标准文件格式。我第一次接触这种文件时&#xff0c;发现它其实就是一个带有特定格式要求的文本文件&#xff0c;但正是这种简单的结构&#xff0c;让它成为MATL…...

SAP ABAP BADI AC_DOCUMENT:跨越VF01/MIRO/AFAB的智能凭证替代实战

1. 为什么需要AC_DOCUMENT BADI&#xff1f; 在SAP标准业务流程中&#xff0c;GGB1提供的凭证替代功能已经能满足大部分常规需求。但实际业务往往更复杂——比如销售开票时&#xff0c;需要根据付款条件动态替换税科目&#xff1b;发票校验时&#xff0c;要根据供应商信息自动填…...

LeagueAkari游戏数据分析工具:从新手到高手的完整进阶攻略

LeagueAkari游戏数据分析工具&#xff1a;从新手到高手的完整进阶攻略 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在英雄联盟游戏…...

ESP32内存不够用?手把手教你修改Arduino IDE分区表,榨干16MB Flash

ESP32内存优化实战&#xff1a;深度定制Arduino IDE分区表释放16MB Flash潜力 当你兴致勃勃地为ESP32开发板换上16MB大容量Flash芯片&#xff0c;却发现Arduino IDE仍然报出"内存不足"的错误时&#xff0c;那种挫败感我深有体会。去年我在开发一个智能家居网关项目时…...

36种阀体混线全自动智能分拣方案|3D视觉+机器人柔性制造实践

一、项目背景与行业痛点在高端流体控制设备制造领域&#xff0c;阀体、阀盖的精密分拣是保障产品质量的核心环节。随着工业设备向小型化、高精度方向发展&#xff0c;客户对阀体组件加工误差的控制要求持续提升&#xff0c;传统生产模式面临显著瓶颈&#xff1a;1. 人工分拣效率…...

AI应用开发面试题总结(非八股文)

前端请求超过 3 秒&#xff0c;怎么分析原因&#xff1f; 1.看前端和网络 F12开发者模式去查看network&#xff0c;首先判断是前端问题还是后端问题 通过查看接口 Waiting 时间进行判断是后端响应时间太长还是说前端渲染问题 2.给后端接口添加日志进一步定位后端问题 3.如果…...

数字遗产:我们写的代码,在死后将归于何处?

一行注释里的永恒追问测试工程师的日常&#xff0c;往往是从一行日志或一个断言开始的。但你是否注意过&#xff0c;在那些被反复修改的代码文件最顶端&#xff0c;常常躺着一行注释&#xff1a;“Author: [某位早已离职的同事]”。这行注释像一座小小的墓碑&#xff0c;标记着…...