c语言练习85:通讯录的实现(基于顺序表实现)

通讯录的实现(基于顺序表实现)

基于动态顺序表实现通讯录 C语⾔基础要求:结构体、动态内存管理、顺序表、⽂件操作

1、功能要求

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

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

3)增加联系⼈信息

4)删除指定联系⼈

5)查找制定联系⼈

6)修改指定联系⼈

7)显⽰联系⼈信息

处理方法:

contact.h

#define  _CRT_SECURE_NO_WARNINGS 
//创建保存联系人数据的结构
#define NAME_MAX 100
#define SEX_MAX 100
#define TEL_MAX 100
#define ADDR_MAX 100
struct ContactInfo
{char name[NAME_MAX];//使用定长数组还是动态数组?char sex[SEX_MAX];//字符数组数组名即为数组首元素地址int age;char tel[TEL_MAX];char addr[ADDR_MAX];
};
typedef struct ContactInfo CInfo;
//通讯表的底层是通过顺序表来实现的
typedef struct SeqList contact;
//通讯录的初始化和销毁
void ContactInit(contact* pcon);//
void ContactDistory(contact* pcon);
//添加联系人
void ContactAdd(contact* pcon);
int FindByName(contact* pcon, char* name);
//删除联系人
void ContactDel(contact* pcon);
//修改联系人
void ContactModify(contact* pcon);
//查看联系人
void ContactShow(contact* pcon);
//查找联系人
void ContactFind(contact* pcon);

Seqlist.h

#define  _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
#include"Contact.h"
//typedef int SLDataType;
typedef struct ContactInfo SLDataType;//更改数据类型为通讯录数据类型
typedef struct SeqList
{SLDataType* a;int size;//顺序表中有效的数据格式int capacity;//顺序表当前的空间大小
}SL;
//typedef struct SeqList SL(即为)
//对顺序表进行初始化
void SLInit(SL* ps);
//对顺序表进行销毁
void SLDestory(SL* ps);
//尾部插入
void SLPushBack(SL* ps, SLDataType x);
//头部插入
void SLPushFront(SL* ps, SLDataType x);
//尾部删除
void SLPopBack(SL* ps);
//头部删除
void SLPopFront(SL* ps);
//打印
void SLPrint(SL* ps);
//判断顺序表是否位空
bool SLIsEmpty(SL* ps);
//在任意位置插入删除
//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x);
//删除指定位置的数据
void SLErase(SL* ps, int pos);
bool SLFind(SL* ps, SLDataType x);
//判断空间是否足够,不够则进行扩容
void SLCheckCapacity(SL* ps);

contact.c

#define  _CRT_SECURE_NO_WARNINGS 
#include"Contact.h"
#include"SeqList.h"
//通讯录的初始化和销毁
void ContactInit(contact* con) {SLInit(con);
}
void ContactDistory(contact* con) {SLDestory(con);
}
void ContactAdd(contact* pcon) {//所有数据都是CInfo里的CInfo info;printf("请输入联系人姓名: \n");scanf("%s", info.name);//数组名即为首地址printf("请输入联系人姓别: \n");scanf("%s", info.sex);printf("请输入联系人年龄: \n");scanf("%d", info.age);printf("请输入联系人电话: \n");scanf("%s", info.tel);printf("请输入联系人地址: \n");scanf("%s", info.addr);//获取到联系人数据后,其被保存到了结构体info中//下一步即为往通讯录顺序表中插入数据SLPushBack(pcon, info);
}
int FindByName(contact* pcon, char* name) {for (int i = 0; i < pcon->size; i++) {if (strcmp(pcon->a[i].name, name) == 0) {return i;}}return -1;
}
//删除联系人
void ContactDel(contact* pcon) {printf("请输入要删除的用户名称:\n");char name[NAME_MAX];scanf("%s", name);int findindex = FindByName(pcon, name);if (findindex < 0) {printf("要删除的用户不存在!\n");return;}//找到了要删除findindex位置的数据SLErase(pcon, findindex);
}
//修改联系人
void ContactModify(contact* pcon) {//打印通讯录所有的数据//先打印表头文字printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "住址");for (int i = 0; i < pcon->size; i++) {printf("%s %s %d %s %s",pcon->a[i].name,pcon->a[i].sex,pcon->a[i].age,pcon->a[i].tel,pcon->a[i].addr);}
}
//查看联系人
void ContactShow(contact* pcon) {}
//查找联系人
void ContactFind(contact* pcon) {}

Seqlist.c

#define  _CRT_SECURE_NO_WARNINGS 
#include"SeqList.h"
void SLInit(SL* ps) {ps->a = NULL;ps->capacity = ps->size = 0;//也可在初始化时开辟空间
}
void SLDestory(SL* ps) {if (ps->a) {free(ps->a);}ps->a = NULL;ps->capacity = ps->size = 0;
}
void SLCheckCapacity(SL* ps) {//空间足够直接尾插//空间不够则进行扩容if (ps->size == ps->capacity) {//空间不够则进行扩容(relloc申请失败返回空指针)int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newCapacity * 2 * sizeof(SLDataType));if (tmp == NULL) {perror("relloc fail\n");return 1;}ps->a = tmp;ps->capacity = newCapacity;}
}
void SLPushBack(SL* ps, SLDataType x){assert(ps != NULL);//空间足够直接尾插//空间不够则进行扩容(relloc申请失败返回空指针)SLCheckCapacity(ps);//直接插入数据ps->a[ps->size] = x;//ps->a[ps->size++] = x;ps->size++;
}
void SLPushFront(SL* ps, SLDataType x) {assert(ps);//判断空间是否足够不够则扩容SLCheckCapacity(ps);for (size_t i = ps->size; i > 0; i--) {ps->a[i] = ps->a[i - 1];}ps->a[0] = x;ps->size++;
}
void SLPopBack(SL* ps) {assert(ps);assert(!SLIsEmpty(ps));//assert(ps->size)也可以//ps->a[ps->size - 1] = 0;//(可有可无)ps->size--;//size最初为0,为0则不能减减
}
void SLPopFront(SL* ps, SLDataType x) {assert(ps);assert(!SLIsEmpty(ps));//进行判空操作,不为空才能继续//让后面数据往前挪一位for (size_t i = 0; i < ps->size-1; i++) {//size_t为无符号整形//最后一次进来i为ps->size-2ps->a[i] = ps->a[i + 1];}ps->size--;
}
void SLPrint(SL* ps) {for (size_t i = 0; i < ps->size; i++) {printf("%d ", ps->a[i]);}printf("\n");
}
bool SLIsEmpty(SL* ps) {assert(ps);return ps->size == 0;//当前数据表有效数据位0,则当前数据表为空
}
//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x) {assert(ps);//对pos加以限制assert(pos >= 0 && pos <= ps->size);//扩容SLCheckCapacity(ps);//把pos位置及以后的数据往后挪动一位//循环里i的初始值可以为size或size-1k,但不同的初始值对应不同的结束条件/*for (size_t i = ps->size; i > pos; i--) {ps->a[i] = ps->a[i - 1];}*/for (size_t i = ps->size-1; i > pos-1; i--) {ps->a[i+1] = ps->a[i];}ps->a[pos] = x; ps->size++;
}
//删除指定位置的数据
void SLErase(SL* ps, int pos) {assert(ps);assert(!SLIsEmpty(ps));//进行判空操作,不为空才能继续//对pos加以限制assert(pos >= 0 && pos <= ps->size);for (int i = pos; i < ps->size - 1; i++) {//最后一次进来的i的数据为ps->size - 2ps->a[i] = ps->a[i + 1];}ps->size--;
}
//bool SLFind(SL* ps, SLDataType x) {
//	assert(ps);
//	for (int i = 0; i < ps->size; i++) {
//		if (ps->a[i] == x) {
//			找到了
//			return true;
//		}
//	}
//	return false;
//}

test.c

#define  _CRT_SECURE_NO_WARNINGS 
#include"SeqList.h"
#include"Contact.h"
//void SLtest() {
//	SL sl;
//	SLInit(&sl);//	//尾部插入//	SLPushBack(&sl, 1);//	SLPushBack(&sl, 2);//	SLPushBack(&sl, 3);//	SLPushBack(&sl, 4);//	SLPrint(&sl);//	//头部插入//	SLPushFront(&sl, 5);//	SLPushFront(&sl, 6);//	SLPushFront(&sl, 7);//	SLPrint(&sl);//	SLPopBack(&sl);//	SLPrint(&sl);//	SLPopBack(&sl);//	SLPrint(&sl);//    SLDestory(&sl);//}//void SLtest02() {//	SL sl;//	SLInit(&sl);//	//尾部插入//	SLPushBack(&sl, 1);//	SLPushBack(&sl, 2);//	SLPushBack(&sl, 3);//	SLPushBack(&sl, 4);//	SLPrint(&sl);//	头删//	//SLPopFront(&sl);//	//SLPrint(&sl);//	//SLPopFront(&sl);//	//SLPrint(&sl);//	//SLDestory(&sl);//	//在指定位置之前插入数据//	/*SLInsert(&sl, 1, 11);//	SLPrint(&sl);//	SLDestory(&sl);*///	删除指定位置的数据//	//SLErase(&sl, 0);//	//SLPrint(&sl);//	//SLErase(&sl, sl.size-1);//	//SLPrint(&sl);//	////	bool findRet=SLFind(&sl, 3);//	if (findRet) {//		printf("找到了\n");//	}//	else {//		printf("没有找到!\n");//	}//    SLDestory(&sl);void contact01() {contact con;ContactInit(&con);//往通讯录中插入数据ContactAdd(&con);ContactDistory(&con);}
//}
int main() {//SLtest();//SLtest02();contact01();return 0;
}

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

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

相关文章

飞凌嵌入式受邀参加「NXP创新技术论坛」

2023年10月10日&#xff0c;「NXP创新技术论坛」在深圳湾万丽酒店举行&#xff0c;飞凌嵌入式作为NXP金牌合作伙伴受邀参加此次论坛&#xff0c;与众多智能工业行业的伙伴深入交流市场趋势与行业洞察&#xff0c;共同促进未来市场的发展。 本次论坛&#xff0c;飞凌嵌入式展示了…

ansible 调研

参考&#xff1a;自动化运维工具——ansible详解&#xff08;一&#xff09; - 珂儿吖 - 博客园 (cnblogs.com) ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、chef、func、fabric&#xff09;的优点&#xf…

使用Plotly模拟远古博弈游戏_掷骰子

不乏投资大师、量化基金经理从着迷博弈游戏开始迈出步伐...... 开始学习使用python包Plotly模拟掷骰子。 安装Plotly 终端输入命令&#xff1a;python3 -m pip install --user plotly 创建骰子类 掷骰子 分析结果 绘制直方图 投掷一个骰子点数的分布 投掷两个骰子1000次的点数…

【QT】Ubuntu 编译安装 QT 5.12.7 源码

直接通过源码来编译安装 QT&#xff0c;难度太大&#xff0c;耗时较长&#xff0c;一般不是特别推荐使用源码安装。 目录 1、下载 QT 源码包 2、搭建安装环境(下载依赖库) 3、编译QT源码的脚本 1、下载 QT 源码包 QT5.12.7源码下载地址: download | QT 5.12.7 选择任意一…

spring boot+ vue+ mysql开发的一套厘米级高精度定位系统源码

UWB室内高精度定位系统源码&#xff0c;自主版权演示 UWB技术最核心的能力就是精准的定位与测距&#xff0c;当然它还具备通信功能。不过&#xff0c;目前主流通信技术已经相当成熟&#xff0c;无需UWB兼顾去做通信传输。而且&#xff0c;如果使用UWB通信功能&#xff0c;反而会…

多媒体播放软件 Infuse mac中文特点介绍

Infuse mac是一款多媒体播放器应用&#xff0c;它支持播放多种格式的视频文件、音频文件和图片文件&#xff0c;并且可以通过AIrPlay将媒体内容投放到其他设备上。Infuse还支持在线视频流媒体播放和本地网络共享&#xff0c;用户可以通过它来访问家庭网络上的媒体文件。 Infuse…

什么是React的虚拟DOM(Virtual DOM)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Linux是什么,其特点是啥

与大家熟知的 Windows 操作系统软件一样&#xff0c;Linux 也是一个操作系统软件&#xff0c;其 logo 是一只企鹅。与 Windows 不同之处在于&#xff0c;Linux 是一套开放源代码程序的、可以自由传播的类 Unix 操作系统软件。Linux&#xff0c;全称GNU/Linux&#xff0c;是一种…

JAXB 使用记录 bean转xml xml转bean 数组 继承

JAXB 使用记录 部分内容引自 https://blog.csdn.net/gengzhy/article/details/127564536 基础介绍 JAXBContext类&#xff1a;是应用的入口&#xff0c;用于管理XML/Java绑定信息 Marshaller接口&#xff1a;将Java对象序列化为XML数据 Unmarshaller接口&#xff1a;将XML数…

Spark入门

Spark 1.Spark概述 2.Spark特点 3.RDD概述 1. Spark概述 什么是Spark 回顾&#xff1a;Hadoop主要解决&#xff0c;海量数据的存储和海量数据的分析计算。 Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Hadoop与Spark历史 Hadoop与Spark框架对比 Dr…

【gmail注册教程】手把手教你注册Google邮箱账号

手把手教你注册Google邮箱账号 写在前面&#xff1a; 要注意&#xff0c;注册Google邮箱必须要确保自己能够 科学上网&#xff0c;如果暂时做不到&#xff0c;请先进行相关学习。使用的手机号是大陆&#xff08;86&#xff09;的。 在保证自己能够科学上网后&#xff0c;在浏…

如何在 Spring Boot 中使用 WebSocket

在Spring Boot中使用WebSocket构建实时应用 WebSocket是一种用于实现双向通信的网络协议&#xff0c;它非常适合构建实时应用程序&#xff0c;如在线聊天、实时通知和多人协作工具。Spring Boot提供了对WebSocket的支持&#xff0c;使得在应用程序中集成WebSocket变得非常容易…

3D包容盒子

原理简述 包围体&#xff08;包容盒&#xff09;是一个简单的几何空间&#xff0c;里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤&#xff08;即当包围体碰撞&#xff0c;才进行精确碰撞检测和处理&#xff09;。包…

Rule-Engine-Starter V1.0.0

一个轻量级的规则引擎、搜索引擎&#xff0c;让条件匹配简单、优雅。 GIT地址 https://gitcode.cosmoplat.com/15011240224/rule-engine-starter 介绍 Rule-Engine-Starter 是一个轻量级规则引擎&#xff0c;V1.0.0主要解决条件匹配问题。比如飞书文档&#xff0c;每个文档都…

【网络安全 ---- 靶场搭建】凡诺企业网站管理系统靶场详细搭建过程(asp网站,练习Access数据库的 sql注入)

一&#xff0c;资源下载 百度网盘资源下载链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com…

【Mysql实现递归树查询】

Mysql8实现递归查询 递归执行分析demo数据查询demo数据扩展字段扩展 大家好! 在我们日常工作中&#xff0c;经常会遇到一些问题,它们的一些解决方案通常会用到递归这一强大的技术手段。递归不仅能帮助我们更高效的解决问题,还可以使代码更简介、更易于理解, 今天我来给大家分享…

竹云筑基,量子加密| 竹云携手国盾量子构建量子身份安全防护体系

9月23日-24日&#xff0c;2023量子产业大会在安徽合肥举行。作为量子科技领域行业盛会&#xff0c;2023年量子产业大会以“协同创新 量点未来”为主题&#xff0c;展示了前沿的量子信息技术、产业创新成果&#xff0c;并举办主旨论坛、量子科普讲座等系列专项活动。量子信息作为…

云服务器带宽对上传下载速度的影响

简单来说就是 云服务器收到数据代表入&#xff0c;带宽大小 < 10时&#xff0c;入带宽大小10 带宽大小 > 10时&#xff0c;出入带宽上限 等于实际购买时候的大小

金融信创黄金三年:小程序生态+跨端技术框架构建

小程序应用场景生态的发展&#xff0c;受益于开源技术的发展&#xff0c;以及响应快速开发的实际业务需求&#xff0c;一些跨端框架如&#xff1a;Electron、wxPython、FinClip、Tauri、Flutter等发展也非常迅速&#xff0c;小程序生态跨端技术框架&#xff0c;不仅能满足自有超…

生活中的视音频技术

生活中的视音频技术 平时我们打开电脑中自己存电影的目录的话&#xff0c;一般都会如下图所示&#xff0c;一大堆五花八门的电影。&#xff08;其实专业的影视爱好者一概会把影视文件分门别类的&#xff0c;但我比较懒&#xff0c;一股脑把电影放在了一起&#xff09; 因为下载…