通讯录项目—顺序表实现

     在上次我介绍顺序表后相信大家对顺序表有了一定的了解,现在就让我们来练练如何用它,这篇是在顺序表基础上新增的(建议看看线性表—顺序表实现-CSDN博客)。

目录

通讯录简介

创建用户信息

适配和理解通讯录

功能实现

初始化通讯录

销毁通讯录

增加用户信息

删除指定用户信息

查找用户信息

修改用户信息

显示用户信息

全代码

Contact.h

Contact.c


通讯录简介

     下面是通讯录要实现的功能。

  1. 能够保存用户信息:名字、性别、年龄、电话、地址等。
  2. 增加用户信息。
  3. 删除指定用户信息。
  4. 查找用户信息。
  5. 修改用户信息。
  6. 显示用户信息。

创建用户信息

     在创建用户信息前依然是要创建两个项目Contact.h,Contact.c用来存放新增的代码。

     用户信息里包含名字,性别,年龄,电话,地址等这需要用结构体来定义。我把结构体给重命名为penInfo。数组的大小我把它定义为了常量(方便后期更改)。

#define NAME_MAX 20
#define GEMDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100typedef struct personInfo
{char name[NAME_MAX];//名字char gender[GEMDER_MAX];//性别int age;//年龄char tel[TEL_MAX];//电话char addr[ADDR_MAX];//地址
}peoInfo;typedef struct SeqList Contact;

     大家可能注意到了这段代码的最后一行有这么一段话typedef struct SeqList Contact,有什么用呢?

     我会在下面的适配和理解通讯录中详解。

适配和理解通讯录

     之前顺序表的arr是指向int类型的指针,但现在它需要指向结构体。还记得为什么要创造SLDataType吗?它是用来表示arr的类型。所以只要把int换成penInfo就可以了  (这里要把Contact.h放在SeqList.h里否则penInfo是未定义的)。

//SeqList.c文件中
typedef peoInfo SLDataType;

     现在让我们回到 typedef struct SeqList Contact 这段代码中。

     再说之前要知道对通讯录操作其实就是对顺序表操作,即通讯录就是顺序表,这其实就是把顺序表的名字改为通讯录。

     这里其实不写这段代码也是OK的。但是,你是要对通讯录操作。如果不改名字,那就是对顺序表操作(虽然它们一样)。你想啊,通讯录写的好好的突然出现顺序表,在我们看来还好但是对于其他人来说就很懵。这里改名字其实就是为了更方便理解

     既然想用顺序表那要在Contact.h里包含SeqList.h头文件,但是头文件是不能相互包含的。所以这里要对顺序表的结构体进行前置声明。这里不能用SL,因为是先定义完顺序表结构体之后在重命名的,如果直接用SL会被认为是未定义的。所以要用 struct SeqList 。

//这种是错误的!!!
struct SeqList;//前置声明
typedef SL Contact;

     

     这是正确的!!!

struct SeqList;//前置声明
typedef struct SeqList Contact;

     可以把前置声明放在重命名里,最后就变成了这样。

typedef struct SeqList Contact;

     用户信息的结构体就是放在通讯录的每一个下标里。

     只要把这里给理解了,下面的代码就很轻松了。 

功能实现

初始化通讯录

     初始化调用一下SLInit函数就好。

//初始化
void ContactInit(Contact* con)
{SLInit(con);
}

销毁通讯录

     销毁调用一下SLDestroy函数就好。

//销毁
void ContactDesTroy(Contact* con)
{SLDestroy(con);
}

增加用户信息

     这里创建一个penInfo的变量info。然后一个一个输入内容。最后调用SLpushBack尾插即可。

//增加
void ContactAdd(Contact* con)
{peoInfo info;printf("请输入联系人的名字:\n");scanf("%s", info.name);printf("请输入联系人的性别:\n");scanf("%s", info.gender);printf("请输入联系人的年龄:\n");scanf("%d", &info.age);printf("请输入联系人的电话:\n");scanf("%s", info.tel);printf("请输入联系人的地址:\n");scanf("%s", info.addr);SLpushBack(con, info);printf("增加成功!\n");
}

     大家可能注意到了只有年龄的scanf中加了&,为什么呢?

     因为它不是数组,其它都是数组。

删除指定用户信息

     在删除数据前要先检查有无该人,其实不光是删除还有查找,修改的函数都要用到。所以把它独立成一个函数,函数名是Findbyname。

     我在这里是用名字来查找的,遍历一遍如果存在返回顺序表下标,否则返回-1。

     判断是否存在的判断条件,我是用strcmp函数来实现的,如果它的返回值为0则存在。

int Findbyname(Contact* con, char name[])
{for (int i = 0; i < con->size; i++){if (strcmp(con->arr[i].name, name) == 0){return i;}}return -1;
}

     剩下的要先创建一个数组来存放要删除人的名字,然后调用Findbyname函数,如果返回值小于0则退出。否则调用SLErase函数用来删除。

//删除
void ContactDel(Contact* con)
{char name[NAME_MAX] = { 0 };printf("请输入要删除联系人的名字;\n");scanf("%s", name);int find = Findbyname(con, name);if (find < 0){printf("该人不存在\n");return;}SLErase(con, find);printf("删除成功!\n");
}

     注意:开辟数组的大小要和结构体(penInfo)的名字数组大小一样大。

查找用户信息

     依然是要开辟数组然后调用Findbyname函数,如果小于0则退出,否则打印此人的信息。

//查找
void ContactFind(Contact* con)
{char name[NAME_MAX] = { 0 };printf("请输入要查找联系人的名字;\n");scanf("%s", name);int find = Findbyname(con, name);if (find < 0){printf("该人不存在\n");return;}printf("名字  性别  年龄  电话  地址\n");printf("%s    %s    %d    %s    %s\n",con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}

修改用户信息

     前面的代码同上,只不过如果返回值大于0则重新输入他的信息即可。

//修改
void ContactModify(Contact* con)
{char name[NAME_MAX] = { 0 };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 ContactShow(Contact* con)
{for (int i = 0; i < con->size; i++){printf("名字  性别  年龄  电话  地址\n");printf("%s    %s    %d    %s    %s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}

全代码

Contact.h

#define NAME_MAX 20
#define GEMDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100typedef struct personInfo
{char name[NAME_MAX];//名字char gender[GEMDER_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)
{SLInit(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("%d", &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 (strcmp(con->arr[i].name, name) == 0){return i;}}return -1;
}
//删除
void ContactDel(Contact* con)
{char name[NAME_MAX] = { 0 };printf("请输入要删除联系人的名字;\n");scanf("%s", name);int find = Findbyname(con, name);if (find < 0){printf("该人不存在\n");return;}SLErase(con, find);printf("删除成功!\n");
}//修改
void ContactModify(Contact* con)
{char name[NAME_MAX] = { 0 };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)
{char name[NAME_MAX] = { 0 };printf("请输入要查找联系人的名字;\n");scanf("%s", name);int find = Findbyname(con, name);if (find < 0){printf("该人不存在\n");return;}printf("名字  性别  年龄  电话  地址\n");printf("%s    %s    %d    %s    %s\n",con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}//展示
void ContactShow(Contact* con)
{for (int i = 0; i < con->size; i++){printf("名字  性别  年龄  电话  地址\n");printf("%s    %s    %d    %s    %s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}

     好了讲到这儿就差不多讲完了,希望你能有所收获。如果有错误的地方请及时指出,有什么不懂的地方可以私信我哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/679204.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java回调机制

目录 一、简介二、示例2.1 同步回调2.2 异步回调2.3 二者区别 三、应用场景 一、简介 在Java中&#xff0c;回调是一种常见的编程模式&#xff0c;它允许一个对象将某个方法作为参数传递给另一个对象&#xff0c;以便在适当的时候调用该方法。 以类A调用类B方法为例: 在类A中…

暗区突围国际服pc端海外版新手前期如何赚钱 暗区突围新手教学

暗区突围国际服pc端海外版新手前期如何赚钱 暗区突围新手教学 暗区突围是一款极为惊险的射击游戏&#xff0c;让玩家充分感受紧张激烈的战斗以及获取财富的过程。但是有许多新手玩家是不会在游戏里赚钱的&#xff0c;也会在赚钱过程中遇到很多问题&#xff0c;我将在这篇文章…

百度云内容审核快速配置 (java)

为什么要选择百度云 &#xff1f; 因为他免费用一年 首先要先开通百度云内容安全服务 按照操作指引走完整套 ContentCensor Java SDK目录结构** com.baidu.aip├── auth //签名相关类├── http //Http通…

BACnet转MQTT网关智联楼宇json格式自定义

智能建筑的BACnet协议作为楼宇自动化领域的通用语言&#xff0c;正逐步迈向更广阔的物联网世界。随着云计算和大数据技术的飞速发展&#xff0c;如何将BACnet设备无缝融入云端生态系统&#xff0c;成为众多楼宇管理者关注的焦点。本文将以一个实际案例&#xff0c;揭示BACnet网…

DJANGO_PART 1

DJANGO_PART 1 文章目录 DJANGO_PART 11. 安装DJANGO2. 创建项目3. APP概念4. 快速上手5. templates6. 引入其它静态文件7. 模板语法8. 请求与响应 1. 安装DJANGO 安装语句&#xff1a;pip install django 2. 创建项目 django中项目会有一些默认的文件和默认的文件夹 终端创建…

在ubuntu虚拟机中手动安装VMware Tools(VMware Workstation 17 player)

可参考官方文档&#xff1a;在 Linux 虚拟机中手动安装 VMware Tools 以下列出我在安装过程中遇见的问题&#xff1a; 1、“安装VMware Tools”选项为灰&#xff0c;无法选中 原因是VMware Tools的安装包镜像在Player的安装目录下&#xff0c;需要在虚拟机启动的时候加载这个…

【Linux】常用基本指令

目录 食用说明 用户管理 whoami/who clear tree 目录结构和路径 pwd ls 文件 隐藏文件 常用选项 cd 家目录、根目录、绝对路径和相对路径 touch 常用选项 mkdir rmdir/rm man cp mv cat nano echo 输出重定向 > 输入重定向 < more/less head/…

国科大深度学习期末历年试卷

本文借鉴 国科大深度学习复习 深度学习期末 深度学习2020 一&#xff0e;名词解释&#xff08;每个2分&#xff0c;共10分&#xff09; 深度学习&#xff0c;稀疏自编码器&#xff0c;正则化&#xff0c;集成学习&#xff0c;Dropout 二&#xff0e;简答题&#xff08;每题…

第18讲:Ceph集群CrushMap的核心概念、默认规则与完整定义

文章目录 1.CrushMap核心概念2.集群默认的CrushMap规则剖析2.1.CrushMap列表显示内容剖析2.2.对默认的CrushMap规则进行深度的剖析2.3.完整的CrushMap定义信息 1.CrushMap核心概念 CrushMap官方文档&#xff1a;https://docs.ceph.com/en/pacific/rados/operations/crush-map/…

nlp课设 - 基于BERT 的情感分类

基于BERT 的情感分类 主要论文&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding&#xff08;双向Transformer 的预训练&#xff09; 核心技术&#xff1a; Embedding 、Attention --> Transformer 任务简介、拟解决问题…

led显示屏用什么胶水封装比较好?

led显示屏用什么胶水封装比较好&#xff1f; LED显示屏通常使用特定的胶水进行封装&#xff0c;以确保其稳定性和耐用性。常见的用于LED显示屏封装的胶水类型包括有机硅灌封胶、环氧树脂灌封胶等。 有机硅灌封胶具有优异的耐高温、防水、绝缘和密封性能&#xff0c;非常适合用…

vue3+vite+js 安装

首先需要node版本高于V16.14.1&#xff0c;我用的node版本 V20.12.0 目前使用的是vue3vitejs&#xff0c;没有使用ts 安装 执行 npm create vitelatest 具体选择按照自己实际需要的来 Project name:项目名称 Select a framework:选择用哪种框架 &#xff08;我选择vue&#…