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

顺序表实现通讯录项目

目录

一.实现功能:

二.文件结构

 三.代码实现

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;
}

感谢观看,再见

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HackTheBox-Machines--Cronos
  • vue使用EventBus进行跨组件通信
  • Android刮刮卡自定义控件
  • Oracle按照主键排序分页sql
  • 2.Redis之Redis的背景知识
  • 可选链与空值合并运算符的妙用
  • C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
  • python:大文件分批/块导入数据库方式记录
  • 富格林:可信方法防备暗箱操作
  • 与神对话-1
  • 面试中算法(A星寻路算法)
  • tomcat--安全配置多虚拟机
  • 2024年,游戏行业还值得进入吗?
  • 在ARM开发板上,栈大小设置为2MB(常用设置)里面存放的数据
  • 盲人社区生活支持体系:织就一张温暖的网
  • Android单元测试 - 几个重要问题
  • DOM的那些事
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • JavaScript DOM 10 - 滚动
  • Java教程_软件开发基础
  • k8s如何管理Pod
  • session共享问题解决方案
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 从伪并行的 Python 多线程说起
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 技术发展面试
  • 将 Measurements 和 Units 应用到物理学
  • C# - 为值类型重定义相等性
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C#)获取字符编码的类
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (一)VirtualBox安装增强功能
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET Project Open Day(2011.11.13)
  • .net6 webapi log4net完整配置使用流程
  • .NET值类型变量“活”在哪?
  • .Net中的集合
  • /bin、/sbin、/usr/bin、/usr/sbin
  • :not(:first-child)和:not(:last-child)的用法
  • @angular/cli项目构建--Dynamic.Form
  • @Autowired和@Resource的区别
  • @ConditionalOnProperty注解使用说明
  • @Documented注解的作用
  • @SpringBootConfiguration重复加载报错
  • @Transactional 竟也能解决分布式事务?
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ C++ ] STL_vector -- 迭代器失效问题