顺序表实现通讯录项目
目录
一.实现功能:
二.文件结构
三.代码实现
1.初始化
2.通讯录的销毁
3.通讯录添加数据
4.通讯录删除数据
5.通讯录的修改
6.展现通讯录数据
7.通讯录查找
四.代码
SeqList.h
Contact.h
Contact.c
test(通讯录).c
一.实现功能:
- ⾄少能够存储100个⼈的通讯信息
- 能够保存⽤⼾信息:名字、性别、年龄、电话、地址等
- 增加联系⼈信息
- 删除指定联系⼈
- 查找制定联系⼈
- 修改指定联系⼈
- 显⽰联系⼈信息
二.文件结构
利用已经实现好的顺序表SeqList.h来实现相关功能,详见数据结构--顺序表-CSDN博客
test.c
Contact.c // ⽂件中写项目中函数的实现等
Contact.h // ⽂件中写项目需要的数据类型和函数声明等
SeqList.h//利用已经实现的顺序表功能
三.代码实现
1.初始化
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100//定义联系人数据结构
//姓名 性别 年龄 电话 地址
typedef struct personInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}peoInfo;
实际上要进行的是顺序表的初始化,顺序表的初始化已经实现好了,所有直接调用顺序表中的SLlnit函数,便可以实现通讯录的初始化,定义ContactInit函数
//通讯录的初始化
void ContactInit(Contact* con)
{SLlnit(con);//指针就是地址,不用&符号
}
因为要用到顺序表相关的方法,对通讯录的操作实际就是对顺序表进行操作
所以给顺序表改个名字,叫通讯录
typedef struct SeqList Contact;
因为要用到SeqList.h中的顺序表,所以要改一下数据类型,改成创建好的通讯录类型
typedef peoInfo SLDataType;//顺序表存放的类型可能是int 也可能是char,所有重新起个名字,方便以后更改
//动态顺序表
typedef struct SeqList
{SLDataType* arr;int size;//有效数据个数int capacity;//空间大小
}SL;
2.通讯录的销毁
使用完了之后,就要进行销毁了
也是一样,可以直接调用顺序表实现好的方法
//通讯录的销毁
void ContactDesTroy(Contact* con)
{SLDestroy(con);
}
3.通讯录添加数据
这里首先接收用户要添加的数据,然后调用顺序表当中的头插或尾插
//通讯录添加数据
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);printf("添加成功\n");
}
4.通讯录删除数据
要删除的数据必须存在,才能执行删除操作,所以在这之前要先实现一个查找函数FindByName
int FindByName(Contact* con, char name[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].name, name))//strcmp函数两个字符串比较,相等返回0{//找到了return i;}//没找到return -1;}
}
删除函数ContactDel
//通讯录删除数据
void ContactDel(Contact* con)
{//要删除的数据必须要存在,才能执行删除操作//查找char name[NAME_MAX];printf("请输入要删除的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);//查找函数,返回数据下标if (find < 0){printf("要删除的联系人数据不存在\n");return;}//要删除的联系人数据存在--》知道了要删除的联系人数据对应的下标SLErase(con, find);//顺序表中指定位置删除函数printf("删除成功\n");
}
5.通讯录的修改
在实现操作之前,也需调用一次FindByName确认一个指定数据存在与否
//通讯录的修改
void ContactModify(Contact* con)
{//要修改的联系人数据存在char name[NAME_MAX];printf("请输入要修改的用户姓名:\n");scanf("%s", name);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("%d", &con->arr[find].age);printf("请输入新的电话:\n");scanf("%s", con->arr[find].tel);printf("请输入新的住址:\n");scanf("%s", con->arr[find].addr);printf("修改成功!\n");
}
6.展现通讯录数据
//展示通讯录数据
void ContactShow(Contact* con)
{//表头:姓名 性别 年龄 电话 地址printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");//遍历通讯录,按照格式打印每个联系人数据for (int i = 0; i < con->size; i++){printf("%3s %3s %3d %3s %3s\n", con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}
7.通讯录查找
利用FindByName函数找到所需的数据下标,并打印这个联系人信息
void ContactFind(Contact* con)
{//11char name[NAME_MAX];printf("请输入要查找的联系人姓名\n");scanf("%s", name);int find = FindByName(con, name);//查找函数,返回数据下标if (find < 0){printf("要查找的联系人数据不存在!\n");return;}// 姓名 性别 年龄 电话 地址// 11 11 11 11 11printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%3s %3s %3d %3s %3s\n",con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}
四.代码
SeqList.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Contact.h"
//定义顺序表的结构//#define N 100静态顺序表
//struct SeqList
//{
// int arr[N];
// int size;//有效数据个数
//};typedef peoInfo SLDataType;//顺序表存放的类型可能是int 也可能是char,所有重新起个名字,方便以后更改
//动态顺序表
typedef struct SeqList
{SLDataType* arr;int size;//有效数据个数int capacity;//空间大小
}SL;//顺序表初始化
void SLlnit(SL* ps);
//顺序表的销毁
void SLDestroy(SL* ps);
//顺序表的打印
void SLprint(SL s);//头部插入删除/尾部插入删除
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);void SLPopBack(SL* ps);
void SLPopFront(SL* ps);//指定位置之前插入/删除数据
void SLlnsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);//查找
int SLFind(SL* ps, SLDataType x);
Contact.h
#pragma once#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100//定义联系人数据结构
//姓名 性别 年龄 电话 地址
typedef struct personInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}peoInfo;//要用到顺序表相关的方法,对通讯录的操作实际就是对顺序表进行操作
//给顺序表改个名字,叫通讯录
typedef struct SeqList Contact;//通讯录相关的方法
//
//
//通讯录的初始化
void ContactInit(Contact* con);
//通讯录的销毁
void ContactDesTroy(Contact* con);
//通讯录添加数据
void ContactAdd(Contact* con);
//通讯录删除数据
void ContactDel(Contact* con);
//通讯录的修改
void ContactModify(Contact* con);
//通讯录查找
void ContactFind(Contact* con);
//展示通讯录数据
void ContactShow(Contact* con);
Contact.c
#include"SeqList(通讯录).h"
#include"Contact.h"
//通讯录的初始化
void ContactInit(Contact* con)
{//实际上要进行的是顺序表的初始化//顺序表的初始化已经实现好了SLlnit(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);printf("添加成功\n");
}int FindByName(Contact* con, char name[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].name, name))//strcmp函数两个字符串比较,相等返回0{//找到了return i;}//没找到return -1;}
}//通讯录删除数据
void ContactDel(Contact* con)
{//要删除的数据必须要存在,才能执行删除操作//查找char name[NAME_MAX];printf("请输入要删除的联系人姓名:\n");scanf("%s", name);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("%3s %3s %3d %3s %3s\n", con->arr[i].name,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", name);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("%d", &con->arr[find].age);printf("请输入新的电话:\n");scanf("%s", con->arr[find].tel);printf("请输入新的住址:\n");scanf("%s", con->arr[find].addr);printf("修改成功!\n");
}//通讯录查找
void ContactFind(Contact* con)
{//11char name[NAME_MAX];printf("请输入要查找的联系人姓名\n");scanf("%s", name);int find = FindByName(con, name);//查找函数,返回数据下标if (find < 0){printf("要查找的联系人数据不存在!\n");return;}// 姓名 性别 年龄 电话 地址// 11 11 11 11 11printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%3s %3s %3d %3s %3s\n",con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}
test(通讯录).c
#include"SeqList(通讯录).h"
void menu()
{printf("******************通讯录******************\n");printf("*******1.增加联系人 2.删除联系人********\n");printf("*******3.修改联系人 4.查找联系人********\n");printf("*******5.展示联系人 0. 退出 *********\n");printf("******************************************\n");
}
int main()
{//SLTest01();//ContactTest();int op = -1;Contact con;//创建一个顺序表--通讯录ContactInit(&con);//初始化do {menu();printf("请选择您的操作:\n");scanf("%d", &op);//要根据对应的op执行不同的操作switch (op){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("退出通讯录....\n");break;default:printf("输入错误,请重新选择您的操作!\n");break;}} while (op != 0);ContactDesTroy(&con);//销毁return 0;
}
感谢观看,再见
相关文章:
顺序表实现通讯录项目
目录 一.实现功能: 二.文件结构 三.代码实现 1.初始化 2.通讯录的销毁 3.通讯录添加数据 4.通讯录删除数据 5.通讯录的修改 6.展现通讯录数据 7.通讯录查找 四.代码 SeqList.h Contact.h Contact.c test(通讯录).c 一.实现功能: ⾄少能够存…...
【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf
联想笔记本 y9000p创建python工程: 使用langchain支持openai的向量化embedding安装软件包 发现没有openai ,添加软件仓库打开工具窗口 点击设置...
LeetCode:279.完全平方数
class Solution:def numSquares(self, n: int) -> int:dp[i for i in range(n1)]for i in range(2,n1):for j in range(1,int(i**(0.5))1):dp[i]min(dp[i],dp[i-j*j]1)return dp[-1]代码解释 初始化 DP 数组: dp [i for i in range(n1)] 这里,dp[i]…...
Python面试宝典:Python中与ORM技术(对象关系映射)相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)
Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第十五章:数据库编程:第二节:ORM技术】 第十五章:数据库编程第二节:ORM技术SQLAlchemyDjango ORMORM技术的优势和劣势python中与ORM技术相关的面试笔试题面试题1面试题2面试题3面试题…...
VUE3+TS+elementplus创建table,纯前端的table
一、前言 开始学习前端,直接从VUE3开始,从简单的创建表格开始。因为自己不是专业的程序员,编程主要是为了辅助自己的工作,提高工作效率,VUE的基础知识并不牢固,主要是为了快速上手,能够做出一些…...
UE驻网失败问题(二)
另一个UE注册失败的问题,具体过程如下: 问题现象如上,UE在这个N48上的小区一直在重复上述过程,收到RRC Setup后就不发RRC Setupcomplete,闭上眼睛也知道大概率是这个RRC Setup的配置有问题。 在问题时间点周围查看&…...
【MySQL】第三周作业
【MySQL】第三周作业 1、在数据库example下创建college表。2、在student表上创建视图college_view。3、查看视图college_view的详细结构4、 更新视图。5 、修改视图,6 、删除视图college_view 1、在数据库example下创建college表。 College表内容如下所示 字段名 …...
香橙派 Kunpeng Pro使用教程:从零开始打造个人私密博客
一、引言 在这个日益互联的世界中,单板计算机已经成为创新和个性化解决方案的重要载体。而在单板计算机领域,香橙派 Kunpeng Pro凭借其强大的性能和灵活的应用潜力,正逐渐吸引着全球开发者和技术爱好者的目光。 作为一款集成了华为的鲲鹏处…...
深入探索:中文字符的编码与转移字符的奥秘
新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:探索字符编码的世界 二、字符编码基础:理解ASCII与Unicode…...
Ubuntu中 petalinux 安装 移植linux --tftp/tftp-hpa服务的方法
Xilinx 文档 PetaLinux 指南:如何创建 PetaLinux 环境 (2019.1) PetaLinux工具参考指南 PetaLinux安装详解(Xilinx , linux, zynq, zynqMP) petalinux 2020.1安装教程 一、PetaLinux工具和库安装 PetaLinux 工具要求主机系统 /bin/sh 为“b…...
JVM(内存区域划分、类加载机制、垃圾回收机制)
目录 一. 内存区域划分 1.本地方法栈(Native Method Stacks) 2.虚拟机栈(JVM Stacks) 3.程序计数器(Program Counter Register) 4.堆(Heap) 5.元数据区(Metaspace) 二.类加载机制 1.加载 2.验证 3.准备 4.解析 5.初始化 "双亲委派模型" 三. GC 垃圾回收…...
C语言---基础内容(万字)
C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯里奇在贝尔电话实验室设计开发了 C 语言。 C 语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程…...
c语言从入门到函数速成(完结篇)
哈喽,小伙伴们大家好呀,本篇文章是这个系列的完结篇,希望大家看完后能有所收获哦 首先能看到这里的同学,一定也是自觉性比较强的了,我会在文章末尾给大家发点小福利 那么,我们先来通过数学中的函数来引入一…...
关于linux磁盘告警问题
案例:我们在执行df命令时,查看到磁盘利用率很高,但是到相对应的目录执行du -sh *来找大文件时进行删除时,发现各个目录相加并不大,如下图: 使用df命令查看到根(/)目录使用到33G,而du命令显示只使…...
冯喜运:5.27黄金暴跌大阴后出现“暂定符”今日黄金原油操作策略
【黄金消息面分析】:金价虽然有大阴线暴跌,但依然属于超买后的调整而非熊市,对中长线投资者来说只是市场洗牌。因此,在出现企稳迹象之后,随时关注反弹时机的启动。未来几日,黄金空头可能在进一步发力之前需…...
前端JS必用工具【js-tool-big-box】学习,获取全球重点城市时间
我们去住一些旅馆的时候,或者一些国际性网站,经常可以看见他们的钟表会展示一些国家地区的时间,这个就是很常用的功能。但如果不常接触这个功能的开发网站呢,大家就看自己电脑右下角的时间展示,就是自己当前的具体时间…...
BioTech - 将蛋白质的 PDB 格式文件 转换成 mmCIF 格式文件 (Python)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/139234247 蛋白质的三维结构信息通常可以通过两种格式的文件来获取:PDB (Protein Data Bank) 和 mmCIF (Macromolecular Crystallographic Information File…...
【编程题-错题集】奇数位丢弃(模拟 - 规律)
牛客对应题目链接:奇数位丢弃_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 通过⼀两个例子的模拟,可以发现:每次起始删除的下标都是 2 的次方。根据这个规律,找到最后⼀次删除的起始位置的下标即可。 二、代码 #include <io…...
Docker安装MongoDB(Linux版)
文章目录 前言一、Docker环境的准备1.安装依赖2.安装Docker 二、使用Docker安装MongoDB1.mongo版本选取2.拉取合适的镜像3.宿主机创建MongoDB需要挂载的文件夹4.第一次无认证创建mongo用户5.启动需要认证的mongo容器 问题汇总总结 前言 本文章主要介绍在Centos系统,…...
【设计模式】JAVA Design Patterns——Commander(指挥官模式)
🔍目的 用于处理执行分布式事务时可能遇到的所有问题。 🔍解释 处理分布式事务很棘手,但如果我们不仔细处理,可能会带来不想要的后果。假设我们有一个电子商务网站,它有一个支付微服务和一个运输微服务。如果当前运输…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果,为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
