【数据结构初阶】顺序表的应用

news2025/6/2 14:32:03

在这里插入图片描述

文章目录

  • 顺序表的应用
    • 基于动态顺序表实现通讯录
      • 前言
      • 1.定义联系人数据
      • 2.给顺序表改名
      • 3.通讯录的初始化
      • 4.通讯录的销毁
      • 5.通讯录添加数据
      • 6.通讯录删除数据
      • 7.通讯录修改数据
      • 8.通讯录查找数据
      • 9.展示通讯录数据
      • 10.通讯录的最终实现

顺序表的应用

基于动态顺序表实现通讯录

前言

功能要求

1)⾄少能够存储100个⼈的通讯信息

2)能够保存⽤⼾信息:名字、性别、年龄、电话、地址等

3)增加联系⼈信息

4)删除指定联系⼈

5)查找制定联系⼈

6)修改指定联系⼈

7)显⽰联系⼈信息

我们采用多个文件实现,用到上次顺序表中的功能

在这里插入图片描述

1.定义联系人数据

//Contact.h中
//姓名 性别 年龄 电话 地址
#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;

在SeqList.h中一定要包含”Contact.h”

2.给顺序表改名

//Contact.h中
//要用到顺序表的相关方法,对通讯录的操作实际就是对顺序表进行操作
//给顺序表改个名字,叫通讯录 用typedef

//前置声明
typedef struct SeqList Contact;

3.通讯录的初始化

void ContactInit(Contact* con)
{
	//实际上是进行顺序表的初始化
	//顺序表的初始化已经实现好了
	SLInit(con);
}

4.通讯录的销毁

void ContactDestroy(Contact* con)
{
	SLDestroy(con);
}

5.通讯录添加数据

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

6.通讯录删除数据

int FindByname(Contact* con, char name[])//查找要删除的数据
{
	for (int i = 0; i < con->size; i++)//遍历数组
	{
		if (0 == strcmp(con->arr[i].name,name))
		{
			//找到了
			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;//因为是void 所以不填
	}
	//要删除的联系人存在--->知道了联系人对应的下标
	SLErease(con, find);
	printf("删除成功\n");
}

7.通讯录修改数据

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

8.通讯录查找数据

void ContactFind(Contact* con)
{
	//11 
	//把信息都打印出来
	//姓名 性别 年龄 电话 地址
	char name[NAME_MAX];
	printf("请输入要查找的联系人的姓名:\n");
	scanf("%s", name);
	int find = FindByname(con,name);
	if (find < 0)
	{
		printf("要查找的联系人不存在!\n");
		return;
	}
	//要查找的联系人存在
	//表头:姓名 性别 年龄 电话 地址
	printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
	//遍历通讯录
	printf("%4s %4s %4d %4s %4s\n", 
		con->arr[find].name,
		con->arr[find].gender,
		con->arr[find].age,
		con->arr[find].tel,
		con->arr[find].addr
	);
			
}

9.展示通讯录数据

void ContactShow(Contact* con)
{
	//表头:姓名 性别 年龄 电话 地址
	printf("%4s %4s %4s %4s %4s\n", "姓名", "性别", "年龄", "电话", "地址");
	//遍历通讯录
	for (int i = 0; i < con->size; i++)
	{
		printf("%4s %4s %4d %4s %4s\n", 
			con->arr[i].name,
			con->arr[i].gender, 
			con->arr[i].age,
			con->arr[i].tel, 
			con->arr[i].addr
		);
	}
}

10.通讯录的最终实现

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

}
int main()
{
	int op = -1;
	Contact con;
	ContactInit(&con);//初始化
	do {
		menu();
		printf("请选择您的操作:\n");
		scanf("%d", &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;
		default:
			printf("退出通讯录");
			break;

		}
	} while (op);
	
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#数字图像处理(一)

文章目录 1.C#图像处理基础1.1 Bitmap类1.2 Bitmapdata类1.3 Graphics类1.4 Image类 2.彩色图像灰度化1.提取像素法2.内存法3.指针法三种方法的比较4.灰度图像二值化&#xff1a; 3.相关链接 Bitmap类、 Bitmapdata类和 Graphics类是C#图像处理中最重要的3个类,如果要用C# 进行…

麻省理工新突破:家庭场景下机器人实现精准控制,real-to-sim-to-real学习助力

麻省理工学院电气工程与计算机科学系Pulkit Agrawal教授&#xff0c;介绍了一种新方法&#xff0c;可以让机器人在扫描的家庭环境模拟中接受训练&#xff0c;为任何人都可以实现定制的家庭自动化铺平了道路。 本文将探讨通过Franka机器人在虚拟环境中训练的特点&#xff0c;研…

从零实现本地语音识别(FunASR)

FunASR 是达摩院开源的综合性语音处理工具包&#xff0c;提供语音识别&#xff08;ASR&#xff09;、语音活动检测&#xff08;VAD&#xff09;、标点恢复&#xff08;PUNC&#xff09;等全流程功能&#xff0c;支持多种主流模型&#xff08;如 Paraformer、Whisper、SenseVoic…

已解决:.NetCore控制台程序(WebAPI)假死,程序挂起接口不通

本问题已得到解决&#xff0c;请看以下小结&#xff1a; 关于《.NetCore控制台程序(WebAPI)假死,程序暂停接口不通》的解决方案 记录备注报错时间2025年报错版本VS2022 WINDOWS10报错复现鼠标点一下控制台&#xff0c;会卡死报错描述——报错截图——报错原因 控制台启用了“快…

Excel如何分开查看工作表方便数据撰写

首先我这里有2class和3class两个工作表 接下来我们点击视图 按照顺序分别点击新建窗口和全部重排 ### 然后就是这样 接下来就OK了

微软技术赋能:解锁开发、交互与数据潜力,共探未来创新路

在微软 Build 2025 大会以及创想未来峰会上&#xff0c;微软展示的一系列前沿技术与创新应用&#xff0c;不仅展现了其在科技领域的深厚底蕴与前瞻视野&#xff0c;更为开发者和企业带来了前所未有的机遇与变革动力。 领驭科技作为微软中国南区核心合作伙伴及 HKCSP 1T 首批授…

VR看房系统,新生代看房新体验

VR看房系统的概念 虚拟现实&#xff08;VirtualReality,VR&#xff09;看房系统&#xff0c;是近年来随着科技进步在房地产行业中兴起的一种创新看房方式。看房系统利用先进的计算机技术模拟出一个三维环境&#xff0c;使用户能够身临其境地浏览和体验房源&#xff0c;无需亲自…

【Linux笔记】Shell-脚本(下)|(常用命令详细版)

在&#xff08;上&#xff09;篇&#xff0c;我们详细的讲解了Shell脚本的基础知识和些许命令与实验&#xff0c;这次的的&#xff08;下&#xff09;篇&#xff0c;我们会详细讲解Shell脚本的常用命令 关于脚本的基础知识请各位移步到&#xff08;上&#xff09;篇啦~ Shell…

钉钉热点实时推送助理-思路篇

以下是针对热点实时推送助理的功能描述&#xff0c;结合机器学习技术栈与用户场景的通俗化解释&#xff1a; 快速体验的话直接用钉钉扫描下方二维码体验 1. 核心功能 &#xff08;1&#xff09;热点抓取引擎 类比&#xff1a;像蜘蛛爬取全网信息&#xff08;网络爬虫信息抽取…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.11 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.11 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图。 dataframe<-data.frame( densityc(570,565,…

《软件工程》实战— 在线教育平台开发

一、项目概述 1.1 项目背景与目标 随着教育数字化转型加速&#xff0c;传统教育模式逐渐向线上迁移&#xff0c;教育机构急需一个支持多终端访问、实时互动及高并发场景稳定运行的在线教育平台。本项目旨在构建学生、教师、管理员三位一体的协作教学环境&#xff0c;实现 50-2…

iOS 使用CocoaPods 添加Alamofire 提示错误的问题

Sandbox: rsync(59817) deny(1) file-write-create /Users/aaa/Library/Developer/Xcode/DerivedData/myApp-bpwnzikesjzmbadkbokxllvexrrl/Build/Products/Debug-iphoneos/myApp.app/Frameworks/Alamofire.framework/Alamofire.bundle把这个改成 no 2 设置配置文件

Python打卡训练营学习记录Day41

DAY 41 简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 →…

C++深入类与对象

在上一篇中提到了构造函数&#xff0c;那么这篇再来提一下构造函数&#xff0c;编译器自动生成的默认构造函数对于内置类型不做处理&#xff0c;自定义类型会调用它自己的构造函数。对于自己写的构造函数&#xff0c;之前是在函数体中初始化&#xff0c;当然不止这一种初始化&a…

阿里云服务器邮件发送失败(dail tcp xxxx:25: i/o timeout)因为阿里云默认禁用 25 端口

最近在测试发送邮件的功能&#xff0c;发现了一个奇怪的问题&#xff0c;同样的 docker 镜像&#xff0c;在本地跑起来是可以正常发送邮件的&#xff0c;但是在阿里云的服务器上跑&#xff0c;就会报错 i/o timeout。 排查了一圈发现&#xff0c;原来是阿里云的操作&#xff0…

力扣HOT100之动态规划:322. 零钱兑换

这道题和上一道题279.完全平方数的套路是完全一样的&#xff0c;但是这道题不需要我们自己生成物品列表&#xff0c;函数的输入中已经给出了&#xff0c;但是这道题有一个坑&#xff0c;就是我们在初始化dp数组的时候&#xff0c;所有的位置不应该赋值为INT_MAX&#xff0c;因为…

电商售后服务系统与其他系统集成:实现售后流程自动化

在竞争激烈的电商市场中&#xff0c;优质的售后服务对于提升用户满意度和忠诚度至关重要。然而&#xff0c;售后服务流程通常涉及多个环节和系统&#xff0c;如何高效地管理这些流程&#xff0c;减少人工干预&#xff0c;提升服务效率&#xff0c;是电商企业亟待解决的问题。电…

kafka学习笔记(三、消费者Consumer使用教程——消费性能多线程提升思考)

1.简介 KafkaConsumer是非线程安全的&#xff0c;它定义了一个acquire()方法来检测当前是否只有一个线程在操作&#xff0c;如不是则会抛出ConcurrentModifcationException异常。 acquire()可以看做是一个轻量级锁&#xff0c;它仅通过线程操作计数标记的方式来检测线程是否发…

[JVM] JVM内存调优

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

秒出PPT正式改名秒出AI,开启AI赋能新体验!

在现代办公环境中&#xff0c;借助智能工具提升工作效率已经成为趋势。秒出AI作为一款集AI PPT制作、动画、巨幕、视频、设计以及智能简历功能于一体的综合办公平台&#xff0c;为用户提供一站式智能内容生成解决方案&#xff0c;极大地简化了内容创作流程。 1. AI驱动的一键P…