基于顺序表的通讯录实现

一、前言

基于已经学过的顺序表,可以实现一个简单的通讯录。

二、通讯录相关头文件

//Contact.h
#pragma once

#define NAME_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 20
#define GENDER_MAX 20

typedef struct PersonInfo
{
	char name[NAME_MAX];
	char gender[GENDER_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PsInFo;

//struct SeqList;//前置声明

typedef struct SeqList Contact;//对顺序表重命名为通讯录

//通讯录的初始化
void ContactInit(Contact* pcon);

//通讯录的销毁
void ContactDestroy(Contact* pcon);

//添加联系人
void ContactAdd(Contact* pcon);

//删除联系人
void ContactDel(Contact* pcon);

//查找联系人
void ContactFind(Contact* pcon);

//修改联系人
void ContactModify(Contact* pcon);

//展示联系人
void ContactShow(Contact* pcon);



上述代码中结构体是我们自己定义的通讯录中联系人的基本信息,通讯录中的联系人就相当于是顺序表中的一个个数据,而通讯录就相当于是顺序表;

至于后面两行代码(前置声明和重命名)需要结合以下代码来理解

//SeqList.h
#pragma once
//顺序表
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

//引用通讯录的头文件来对数据类型进行重命名
#include"Contact.h"

typedef PsInFo SeqDatatype;

typedef struct SeqList
{
	SeqDatatype* arr;
	int size;
	int capacity;
}SL;

//初始化顺序表
void SeqInit(SL* ps);
//销毁顺序表
void SeqDestroy(SL* ps);
//顺序表尾插
void SeqPushBack(SL* ps, SeqDatatype x);
//申请空间
void SeqCheckSpace(SL* ps);
//打印顺序表的元素
void SeqPrint(SL* ps);
//顺序表头插
void SeqPushFront(SL* ps, SeqDatatype x);
//顺序表尾删
void SeqPopBack(SL* ps);
//顺序表头删
void SeqPopFront(SL* ps);
//指定位置前插入数据
void SeqInsert(SL* ps, int pos, SeqDatatype x);
//删除指定位置的数据
void SeqErase(SL* ps, int pos);
//寻找数据(以下标的形式返回)
//int SeqFind(SL s, SeqDatatype x);

这是顺序表的头文件,我们为了将联系人PsInFo定义为新的数据类型需要引用Contact.h的头文件,这是因为联系人是在Contact.h中定义的;所以现在回到第一段本文展示的代码中的那两行代码(前置声明和重命名),我们为了让SeqList等同于Contact,需要重命名,但是此时要使用SeqList不能直接包含SeqList.h这个头文件,这时因为头文件不能互相包含,此时我们需要进行前置声明,也就是struct SeqList; 可以直接结合起来写成typedef struct SeqList Contact;

值得注意的是,这里不能写成typedef SL Contact;因为这相当于没有进行前置声明。解释:虽然在顺序表头文件中,typedef strcut SeqList{·······}SL 看似是结构体和SL一起定义的,但实际上是结构体先定义的,也就是说,在这个结构体未定义的时候就使用SL是非法的,在Contact.h中写成typedef SL Contact; 就是遇到了这种错误,所以要进行前置声明,这样就能规避这种问题。

三、通讯录的具体实现

1、初始化

//初始化通讯录
void ContactInit(Contact* pcon)
{
	assert(pcon);
	SeqInit(pcon);
}

2、销毁

//通讯录销毁
void ContactDestroy(Contact* pcon)
{
	assert(pcon);
	SeqDestroy(pcon);
}

3、添加联系人

//添加联系人
void ContactAdd(Contact* pcon)
{
	assert(pcon);
	SeqCheckSpace(pcon);
	PsInFo 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);
	SeqPushBack(pcon,info);
}

 把联系人当成顺序表中的数据,先把这个数据赋予确定的数值,在这里相当于是给联系人输入一个个属性(姓名、性别、年龄······),最后进行顺序表尾插的操作;

4、返回联系人下标

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

这个函数是通过姓名比较的方式来返回即将进行一系列操作的联系人的下标 

5、删除联系人

//删除联系人
void ContactDel(Contact* pcon)
{
	assert(pcon);
	assert(pcon->size);
	char name[NAME_MAX];
	printf("输入要删除的联系人姓名:\n");
	scanf("%s", name);
	int rsl=FindByName(pcon,name);
	if (rsl == -1)
	{
		printf("你要删除的联系人不存在\n");
	}
	else
	{
		SeqErase(pcon, rsl);
	}
}

首先判断这个通讯录里面有没有联系人,没有联系人则断言错误,无法删除。接着要输入一个联系人姓名,再在通过FindByName这个通讯录里面进行遍历看是否有没有这个联系人,如果没有接收到错误的下标,进行不了后续操作;找到了返回这个姓名的联系人的下标,然后使用SeqErase删除这个下标处的联系人;

6、查找联系人

//查找联系人
void ContactFind(Contact* pcon)
{
	assert(pcon);
	char name[NAME_MAX];
	printf("输入要查找的联系人姓名:\n");
	scanf("%s", name);
	int rsl = FindByName(pcon, name);
	if (rsl == -1)
	{
		printf("你要查找的联系人不存在\n");
	}
	else
	{
		printf("%s""%s""%s""%s""%s", "姓名 ", "性别 ", "年龄 ", "电话 ", "地址 ");
		printf("\n");
		printf("%s ""%s ""%d ""%s ""%s ", 
			pcon->arr[rsl].name, 
			pcon->arr[rsl].gender, 
			pcon->arr[rsl].age, 
			pcon->arr[rsl].tel, 
			pcon->arr[rsl].addr);
		printf("\n");
	}
}

查找联系人不同于返回联系人下标,它要展示出所查找的这个联系人的相关信息;

7、修改联系人信息

//修改联系人
void ContactModify(Contact* pcon)
{
	assert(pcon);
	char name[NAME_MAX];
	printf("输入要修改信息的联系人姓名:\n");
	scanf("%s", name);
	int rsl = FindByName(pcon, name);
	if (rsl == -1)
	{
		printf("你要修改信息的联系人不存在\n");
	}
	else
	{
		printf("开始输入新的联系人信息\n");
		printf("输入联系人姓名:\n");
		scanf("%s", pcon->arr[rsl].name);
		printf("输入联系人性别:\n");
		scanf("%s", pcon->arr[rsl].gender);
		printf("输入联系人年龄:\n");
		scanf("%d", &pcon->arr[rsl].age);
		printf("输入联系人电话:\n");
		scanf("%s", pcon->arr[rsl].tel);
		printf("输入联系人地址:\n");
		scanf("%s", pcon->arr[rsl].addr);
	}
}

同样的,先通过姓名的比较来判断该联系人存不存在,若是有则重新在此联系人下标处出入相关信息;

8、展示联系人

//展示联系人
void ContactShow(Contact* pcon)
{
	assert(pcon);
	printf("%s""%s""%s""%s""%s", "姓名 ", "性别 ", "年龄 ", "电话 ", "地址 ");
	printf("\n");
	for (int i = 0; i < pcon->size; i++)
	{
		printf("%s ", pcon->arr[i].name);
		printf("%s ", pcon->arr[i].gender);
		printf("%d ", pcon->arr[i].age);
		printf("%s ", pcon->arr[i].tel);
		printf("%s ", pcon->arr[i].addr);
		printf("\n");
	}
}

通过遍历通讯录来展翅一个一个联系人的相关信息。

四、设置操作面板

#include"Contact.h"
#include"SeqList.h"

void menu()
{
	printf("********** 1.增加联系人**********\n");
	printf("********** 2.删除联系人**********\n");
	printf("********** 3.查找联系人**********\n");
	printf("********** 4.修改联系人**********\n");
	printf("********** 5.展示联系人**********\n");
	printf("********** 6.销毁通讯录**********\n");
	printf("********** 0.退出      **********\n");

}
int main()
{
	menu();
	Contact con;
	ContactInit(&con);
	int option = -1;
	do
	{
		printf("输入操作数:\n");
		scanf_s("%d", &option);
		switch (option)
		{
		case 1:
			ContactAdd(&con);
			break;
		case 2:
			ContactDel(&con);
			break;
		case 3:
			ContactFind(&con);
			break;
		case 4:
			ContactModify(&con);
			break;
		case 5:
			ContactShow(&con);
			break;
		case 6:
			ContactDestroy(&con);
			break;
		case 0:
			printf("退出\n");
			return;
		default:
			printf("输入错误,重新选择\n");
		}
	} while (option);
	return 0;
}

  


完。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统一视频接入平台LntonCVS视频监控平台具体功能介绍

LntonCVS视频监控平台是一款基于H5技术开发的安防视频监控解决方案&#xff0c;专为全球范围内不同品牌、协议及设备类型的监控产品设计。该平台提供了统一接入管理&#xff0c;支持标准的H5播放接口&#xff0c;使其他应用平台能够快速集成视频功能。无论开发环境、操作系统或…

适用于Mac和Windows的最佳iPhone恢复软件

本文将指导您选择一款出色的iPhone数据恢复软件来检索您的宝贵数据。 市场上有许多所谓的iPhone恢复程序。各种程序很难选择并选择其中之一。一旦您做出了错误的选择&#xff0c;您的数据就会有风险。 最好的iPhone数据恢复软件应包含以下功能。 1.安全可靠。 2.恢复成功率高…

NoSQL 之 Redis 配置与常用命令

一、关系型数据库与非关系型数据库 1、数据库概述 &#xff08;1&#xff09;关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记 录。 SQL 语句&#xff08;标准数据查询语言&am…

2024年地理信息技术与应用技能大赛·决赛(2024年地理信息技术与应用能力水平考试·中级)

目录 1 请将所有数据的空间参考统一。&#xff08;2分&#xff09; 1.1 题目要求 1.2 详细解析 2 制作台风轨迹图。&#xff08;10分&#xff09; 2.1 题目要求 2.2 详细解析 3 分析台风影响城市&#xff0c;并将结果以独立专题图的形式展示。&#xff08;13分&#xff…

实例演示kafka stream消息流式处理流程及原理

以下结合案例&#xff1a;统计消息中单词出现次数&#xff0c;来测试并说明kafka消息流式处理的执行流程 Maven依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

笔记13:switch多分支选择语句

引例&#xff1a; 输入1-5中的任意一共数字&#xff0c;对应的打印字符A,B,C,D,E int num 0; printf("Input a number[1,5]:"); scanf("%d"&#xff0c;&num); if( num 1)printf("A\n"); else if(num2)printf("B\n"); else i…

【大数据】—FIFA世界杯探索性分析(EDA)

引言 足球&#xff0c;作为全球最受欢迎的运动之一&#xff0c;拥有庞大的粉丝群体和深远的文化影响。自1930年首届FIFA世界杯举办以来&#xff0c;这项赛事已经成为全球体育盛事&#xff0c;吸引了数十亿观众的目光。世界杯不仅是各国足球技艺的较量&#xff0c;更是国家荣誉…

02STM32环境搭建新建工程

STM32环境搭建&新建工程 软件安装&#xff1a;开发方式&新建工程步骤&架构 个人心得 软件安装&#xff1a; 安装Keil5 MDK 安装器件支持包 软件注册 安装STLINK驱动 安装USB转串口驱动 开发方式&新建工程步骤&架构 STM32开发方式&#xff1a; 1.寄存器 …

笔记14:程序中的循环结构

生活中的循环现象&#xff1a; -日复一日&#xff0c;年复一年 -春夏秋冬&#xff0c;四季交替 -周日&#xff0c;周一&#xff0c;周二&#xff0c;周三&#xff0c;周四&#xff0c;周五&#xff0c;周六 -人生是一个轮回&#xff0c;多年后&#xff0c;又会回到最初的原点 …

APP渗透-android12夜神模拟器+Burpsuite实现

一、夜神模拟器下载地址&#xff1a;https://www.yeshen.com/ 二、使用openssl转换证书格式 1、首先导出bp证书 2、将cacert.der证书在kali中转换 使用openssl生成pem格式证书,并授予最高权限 openssl x509 -inform der -in cacert.der -out cacert.pem chmod 777 cacert…

容器:queue(队列)

以下是关于queue容器的总结 1、构造函数&#xff1a;queue [queueName] 2、添加、删除元素: push() 、pop() 3、获取队头/队尾元素&#xff1a;front()、back() 4、获取栈的大小&#xff1a;size() 5、判断栈是否为空&#xff1a;empty() #include <iostream> #include …

解决 MEX 文件 ‘xxx.mexw64‘ 无效: 找不到指定的模块。的问题

1.问题描述 在matlab R2021b中运行编译好后的gptoolbox工具箱中的函数[SVtemp,SFtemp,IF] selfintersect(V,F);报错如下 MEX 文件 E:\MATLAB_File\gptoolbox\mex\selfintersect.mexw64 无效: 找不到指定的模块。出错 offset_bunny (第 15 行) [SVtemp,SFtemp,IF] selfinter…

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器(CPO)优化RF随机森林结合Adaboost分类预测(二分类及多分类)

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类&#xff09; 分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类…

MySQL基础篇(三)数据库的修改 删除 备份恢复 查看连接情况

对数据库的修改主要指的是修改数据库的字符集&#xff0c;校验规则。 将test1数据库字符集改为gbk。 数据库的删除&#xff1a; 执行完该数据库就不存在了&#xff0c;对应数据库文件夹被删除&#xff0c;级联删除&#xff0c;里面的数据表全部被删除。 注意&#xff1a;不要随…

线程同步66666

1. 概述 当有多个线程访问同一个共享资源&#xff08;临界资源&#xff09;时&#xff0c;且不允许同时访问&#xff0c;那么就需要线程同步。常见的线程同步方式&#xff1a;互斥锁、读写锁、条件变量、信号量。 2. 互斥锁 互斥锁的方式可以简单概括为&#xff1a;锁定操作…

ros1仿真导航机器人 navigation

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1navigation导航框架 2导航设置过程 &#xff08;1&#xff09;启动仿真环境 roslaunch why_simulation why_robocup.launch &#xff08;2&#xff09;启动move_base导航、amcl定位 roslaunch why_simulation nav…

【OnlyOffice】桌面应用编辑器,插件开发大赛,等你来挑战

OnlyOffice&#xff0c;桌面应用编辑器&#xff0c;最近版本已从8.0升级到了8.1 从PDF、Word、Excel、PPT等全面进行了升级。随着AI应用持续的火热&#xff0c;OnlyOffice也在不断推出AI相关插件。 因此&#xff0c;在此给大家推荐一下OnlyOffice本次的插件开发大赛。 详细信息…

磁盘就是一个超大的Byte数组,操作系统是如何管理的?

磁盘在操作系统的维度看&#xff0c;就是一个“超大的Byte数组”。 那么操作系统是如何对这块“超大的Byte数组”做管理的呢&#xff1f; 我们知道在逻辑上&#xff0c;上帝说是用“文件”的概念来进行管理的。于是&#xff0c;便有了“文件系统”。那么&#xff0c;文件系统…

深圳晶彩智能ESP32-2432S028R实时观察LVGL9效果

深圳晶彩智能ESP32-2432S028R概述&#xff1a; 深圳晶彩智能出品ESP32-32432S028R为2.8寸彩色屏采用分辨率320x240彩色液晶屏&#xff0c;驱动芯片是ILI9431。板载乐鑫公司出品ESP-WROOM-32&#xff0c;Flash 4M。型号尾部“R”标识电阻膜的感压式触摸屏&#xff0c;驱动芯片是…

以腾讯为例,手把手教你搭建产品帮助中心

一个精心设计的产品帮助中心对于提高用户满意度和体验至关重要。腾讯&#xff0c;作为全球领先的互联网企业&#xff0c;通过其多样化的产品线&#xff08;包括微信、QQ、腾讯游戏、腾讯视频等&#xff09;吸引了亿万用户。下面将以腾讯为例&#xff0c;向您展示如何搭建一个高…