顺序表实现通讯录项目
目录
一.实现功能:
二.文件结构
三.代码实现
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(指挥官模式)
🔍目的 用于处理执行分布式事务时可能遇到的所有问题。 🔍解释 处理分布式事务很棘手,但如果我们不仔细处理,可能会带来不想要的后果。假设我们有一个电子商务网站,它有一个支付微服务和一个运输微服务。如果当前运输…...
终极RVM Gemset完全指南:如何优雅隔离Ruby项目依赖
终极RVM Gemset完全指南:如何优雅隔离Ruby项目依赖 【免费下载链接】rvm Ruby enVironment Manager (RVM) 项目地址: https://gitcode.com/gh_mirrors/rv/rvm Ruby开发中,项目依赖冲突是开发者最头疼的问题之一。Ruby enVironment Manager (RVM) …...
GeoAI实战:如何用Python和QGIS打造智能交通预测系统(附代码)
GeoAI实战:如何用Python和QGIS打造智能交通预测系统(附代码) 最近在帮某省会城市优化公交调度系统时,发现传统GIS工具处理实时交通数据就像用算盘计算火箭轨道——理论可行但实操吃力。这促使我探索出一套结合QGIS可视化优势与Pyt…...
PHP项目实战:手把手教你从零对接易宝支付SDK(含回调处理避坑指南)
PHP实战:易宝支付SDK全流程对接与回调处理深度解析 支付系统作为电商平台的核心模块,其稳定性和安全性直接影响用户体验和平台收益。易宝支付作为国内主流支付解决方案之一,其SDK对接过程看似简单,实则暗藏诸多技术细节。本文将带…...
如何让经典游戏在Windows 10/11上完美运行:DDrawCompat终极解决方案指南
如何让经典游戏在Windows 10/11上完美运行:DDrawCompat终极解决方案指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_…...
3大核心突破让League-Toolkit成为英雄联盟玩家的智能游戏助手
3大核心突破让League-Toolkit成为英雄联盟玩家的智能游戏助手 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节奏的英雄联盟对局中&#…...
QMCDecode终极解决方案:突破QQ音乐加密格式限制的完全指南
QMCDecode终极解决方案:突破QQ音乐加密格式限制的完全指南 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默…...
【V2X】高通平台EMMC复位机制
错误类型 检测函数 返回值 恢复动作 是否会继续升级到 reset/power-cycle 命令 CRC / End Bit / Index 错误 sdhci_cmd_irq() -EILSEQ 结束当前 request;sdhci_needs_reset() 置位后执行 sdhci_do_reset(SDHCI_RESET_CMD/DATA);mmc_request_done() 标记 mmc_retune_needed();…...
PINN实战:如何用PyTorch自定义神经网络结构求解偏微分方程?
PINN实战:PyTorch自定义神经网络架构设计指南 在科学计算领域,物理信息神经网络(PINN)正逐渐成为求解偏微分方程(PDE)的新范式。与传统的数值方法不同,PINN将物理方程直接编码到神经网络中,通过自动微分技术实现端到端的求解。本文…...
SEO_详解SEO优化中站内与站外优化的区别
SEO优化中站内与站外优化的区别详解 在当今的网络世界,SEO(搜索引擎优化)是每一个网站主人都必须掌握的技能。SEO优化主要分为站内优化和站外优化,两者在策略和目标上有着显著的区别。本文将详细解析这两者的区别,并为…...
SmallThinker-3B-Preview赋能网络安全:恶意流量日志的自然语言分析报告
SmallThinker-3B-Preview赋能网络安全:恶意流量日志的自然语言分析报告 最近和几个做安全运维的朋友聊天,他们都在抱怨同一个问题:每天上班第一件事,就是面对防火墙、WAF这些设备吐出来的成千上万条告警日志。里面全是看不懂的IP…...
