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

devtools/2024/10/20 17:31:30/

功能要求

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

增加联系人信息

删除指定联系人

查找制定联系人

修改指定联系人

显示联系人信息

代码实现

头文件

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/devtools/127339.html

相关文章

【C】关机程序以及oj中多组数据的输入~

实现关机程序 设置关机过程 找到cmd&#xff0c;打开 shutdown-s设置关机 -t设置时间关机 60倒计时60s后关机shutdown-a 取消关机 关机代码 用goto #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> //字…

【笔记-Git】git commit

1. 简介 git commit是Git版本控制系统中的基本命令&#xff0c;用于将索引区&#xff08;暂存区&#xff09;中的改动正式记录&#xff08;或“提交”&#xff09;到本地仓库的历史记录中。该命令是版本控制过程中的一个重要步骤&#xff0c;标记项目在某个时间点的状态&#x…

算法题总结(十四)——贪心算法(上)

贪心算法 什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心的套路&#xff08;什么时候用贪心&#xff09; 刷题或者面试的时候&#xff0c;手动模拟一下感觉可以局部最优推出整体最优&#xff0c;而且想不到反例&#xff0c;那么就试一试…

web API基础

作用和分类 作用: 就是使用 JS 去操作 html 和浏览器 分类&#xff1a; DOM (文档对象模型)、 BOM &#xff08;浏览器对象模型&#xff09; 什么是DOM DOM (Document Object Model) 译为文档对象模型&#xff0c;是 HTML 和 XML 文档的编程接口。 HTML DOM 定义了访问和操作 …

推荐IDE中实用AI编程插件,目前无限次使用

插件介绍 一款字节跳动推出的“基于豆包大模型的智能开发工具” 以vscode介绍【pycharm等都可以啊】&#xff0c;这个插件提供智能补全、智能预测、智能问答等能力&#xff0c;节省开发时间 直接在IDE中使用&#xff0c;就不用在网页中来回切换了 感觉还可以&#xff0c;响应速…

LeetCode.102 二叉树的层序遍历

题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 提示&#xff1a; 树中节点数目在范围 [0, 2000] 内-1000 < Node.val < 1000 解题思路 对二叉树进行层序遍历即可&am…

Django-配置mysql

注意&#xff1a;需要在项目中安装mysqlclient包 setting文件数据库相关修改&#xff1a; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mysite3,USER: root,PASSWORD: bai12345,HOST: 127.0.0.1,PORT: 3306,} } 什么是模型&#xff1f;&#xff1a; ORM框架…

目标检测数据集图片及标签同步裁剪

目录 前言 具体方法 使用介绍 完整代码 前言 在目标检测任务中&#xff0c;模型的训练依赖于大量高质量的标注数据。然而&#xff0c;获取足够多的标注数据集往往代价高昂&#xff0c;并且某些情况下&#xff0c;数据集中的样本分布不均衡&#xff0c;这会导致模型的泛化能…