数据结构(二)顺序表应用:通讯录

embedded/2024/10/21 3:58:28/

功能要求

 能够保存联系人信息:名字、性别、年龄、电话、地址等

增加联系人信息

删除指定联系人

查找制定联系人

修改指定联系人

显示联系人信息

代码实现

头文件

seqlist.h

要包含上“contact.h”,否则不能使用contact.h里定义的好的结构

#include"contact.h"

修改数据类型

//typedef int SLDataType;
typedef peoInfo SLDataType;
//方便后续类型的替换
//给int取别名,方便修改数组存储的数据类型
//例如将int类型修改为char类型,在.c文件中的int都要一一替换成chartypedef struct SeqList
{SLDataType* arr;int size;//有效数据个数int capacity;//空间大小   
}SL;

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;
前置声明

contact.h文件中需要用到seqlist中定义的结构体,但头文件不能互相包含,所以需要前置声明

struct SeqList;
//前置声明,不能用SL,要用最开始的名字
//SL是在seqlist.h文件定义好结构体之后取的别名,在这里只是前置声明不能直接使用
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);

源文件

seqlist.c

顺序表的查找要注释掉

结构体和结构体的判断不能直接 ==

//查找
//int SLFind(SL* ps, SLDataType x)
//{
//	assert(ps);
//	for (int i = 0; i < ps->size; i++)
//	{
//		if (  ps->arr[i] == x)
//		{
//			return i;
//		}
//	}
//	return -1;
//}

contact.c
#include "Contact.h"
#include "SeqList.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);
}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;}//要知道要删除的联系人对应的下标SLErase(con, find);printf("删除成功!\n");
}
//通讯录的修改
void ContactModify(Contact* con)
{//要修改的联系人数据存在char name[NAME_MAX];printf("请输入你要修改的联系人姓名\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要修改的联系人数据不存在!\n");return;}//直接修改peoInfo info;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];printf("请输入要查找的联系人姓名\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要查找的联系人数据不存在!\n");return;}printf("查找成功!\n");printf("%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);
}//展示通讯录数据
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);}
}
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()
{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;
}


http://www.ppmy.cn/embedded/129172.html

相关文章

Qt_软件添加版本信息

文章内容: 给生成的软件添加软件的版权等信息 #include <windows.h> //中文的话增加下面这一行 #pragma code_page(65001)VS_VERSION_INFO VERSIONINFO

视频网站开发:Spring Boot框架的高效实现

5 系统实现 5.1用户信息管理 管理员管理用户信息&#xff0c;可以添加&#xff0c;修改&#xff0c;删除用户信息信息。下图就是用户信息管理页面。 图5.1 用户信息管理页面 5.2 视频分享管理 管理员管理视频分享&#xff0c;可以添加&#xff0c;修改&#xff0c;删除视频分…

2009年国赛高教杯数学建模A题制动器试验台的控制方法分析解题全过程文档及程序

2009年国赛高教杯数学建模 A题 制动器试验台的控制方法分析 汽车的行车制动器&#xff08;以下简称制动器&#xff09;联接在车轮上&#xff0c;它的作用是在行驶时使车辆减速或者停止。制动器的设计是车辆设计中最重要的环节之一&#xff0c;直接影响着人身和车辆的安全。为了…

操作系统学习笔记-1.3操作系统引导,虚拟机

文章目录 操作系统引导虚拟机1. **第一类虚拟机&#xff08;Type 1 Hypervisor&#xff09;**概念&#xff1a;特点&#xff1a;例子&#xff1a; 2. **第二类虚拟机&#xff08;Type 2 Hypervisor&#xff09;**概念&#xff1a;特点&#xff1a;例子&#xff1a; 总结 一些琐…

前端原生API调用方法

目录 一、前端API调用 1. XMLHttpRequest (XHR) 2. Fetch API 二、建立后端供前端调用API 三、调用API xhr调用的 fetch调用的 控制台 四、页面跳转&#xff08;重定向&#xff09; 一、前端API调用 1. XMLHttpRequest (XHR) XMLHttpRequest 是一个较老但仍然广泛使…

Linux下Git操作

一、基本命令 1、创建 git 目录&#xff08;工作区&#xff09; mkdir gitcode 2、创建本地仓库&#xff0c;生成 .git 隐藏目录 git init 3、设置配置项 git config user.name "xxx" git config user.email "....." 4、查看配置项 git config -l …

闲说视频清晰度和各种格式、编码技术的发展历史

文章目录 引子清晰度视频格式&#xff1a;MP4、AVI 、MKV、MOV、WMV、FLV 、RMVB等等什么是视频格式MP4AVIMKVMOVWMVFLVRM / RMVB其他 编码技术&#xff1a;MPEG-1、MPEG-2、MPEG-4、RealVideo、DivX、XviD、H.264&#xff08;AVC&#xff09;、H.265&#xff08;HEVC&#xff…

【博士每天一篇文献-算法】持续学习之GEM算法:Gradient Episodic Memory for Continual Learning

1 介绍 年份&#xff1a;2017 期刊&#xff1a; Advances in neural information processing systems 引用量&#xff1a;2829 Lopez-Paz D, Ranzato M A. Gradient episodic memory for continual learning[J]. Advances in neural information processing systems, 2017…