C语言进阶|通讯录的实现

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

C语言基础要求:结构体、动态内存管理、顺序表、文件操作
1、功能要求

  1. 至少能够存储100个人的通讯信息
  2. 能够保存用户信息:名字、性别、年龄、电话、地址等
  3. 增加联系人信息
  4. 删除指定联系人
  5. 查找制定联系人
  6. 修改指定联系人
  7. 显示联系人信息

2、代码实现

【思考1】用静态顺序表和动态顺序表分别如何实现
【思考2】如何保证程序结束后,历史通讯录信息不会丢失

//contact.h
#define NAME_MAX 11
#define TEL_MAX 13
#define SEX_MAX 5
#define ADDR_MAX 14
//通讯录包含的类型
typedef struct
{char name[NAME_MAX];int age;char tel[TEL_MAX];char sex[SEX_MAX];char addr[ADDR_MAX];
}PersonInfo;
//前置声明
struct Seqlist;
typedef struct Seqlist CT;
//初始化
void CTInit(CT* ct);
//销毁
void CTDestroy(CT* ct);
//查看
void CTCheck(CT* ct);
//增加
void CTAdd(CT* ct);
//删除
void CTDel(CT* ct);
//查找
void CTFind(CT* ct);
//修改
void CTVice(CT* ct);
//contact.c
//查找函数
int CTFind1(CT* ct)
{char tmp[NAME_MAX] = { 0 };scanf("%s", tmp);for (int i = 0; i < ct->size; i++){if (!strcmp(tmp, ct->sqlist->name)){return i;}}return -1;}
//赋值函数
void CTAss(SLTYPE* a, SLTYPE* b)
{for (int i = 0; i < NAME_MAX; i++)a->name[i] = b->name[i];a->age = b->age;for (int i = 0; i < TEL_MAX; i++)a->tel[i] = b->tel[i];for (int i = 0; i < SEX_MAX; i++)a->sex[i] = b->sex[i];for (int i = 0; i < ADDR_MAX; i++)a->addr[i] = b->addr[i];
}
//初始化
void CTInit(CT* ct)
{ct->size = 0;ct->capacity = 0;ct->sqlist = NULL;
}
//销毁
void CTDestroy(CT* ct)
{free(ct->sqlist);ct->sqlist = NULL;ct->size = ct->capacity = 0;
}
//查看
void CTCheck(CT* ct)
{printf("%-11s%-8s%-13s%-8s%-14s\n", "姓名", "年龄", "电话", "性别", "住址");for (int i = 0; i < ct->size; i++){printf("%-11s%-8d%-13s%-8s%-14s\n", ct->sqlist[i].name, ct->sqlist[i].age, ct->sqlist[i].tel, ct->sqlist[i].sex, ct->sqlist[i].addr);}
}
//增加
void CTAdd(CT* ct)
{//先判断是否要扩容if (ct->size == ct->capacity){int newcapacity = ct->capacity == 0 ? 4 : 2 * ct->capacity;SLTYPE* tmp = (SLTYPE*)realloc(ct->sqlist, newcapacity * sizeof(SLTYPE));if (tmp == NULL){perror("realloc");exit(1);}ct->sqlist = tmp;}printf("请输入联系人的姓名:\n");scanf("%s", (ct->sqlist+ct->size)->name);printf("请输入联系人的年龄:\n");scanf("%d", &(ct->sqlist+ ct->size)->age);printf("请输入联系人的电话:\n");scanf("%s", (ct->sqlist+ ct->size)->tel);printf("请输入联系人的性别:\n");scanf("%s", (ct->sqlist+ ct->size)->sex);printf("请输入联系人的地址:\n");scanf("%s", (ct->sqlist+ ct->size)->addr);ct->size++;CTSort(ct);
}
//删除
void CTDel(CT* ct)
{printf("请输入要删除的联系人:\n");int pos = CTFind1(ct);if (pos == -1){printf("找不到此联系人,请检查是否输入错误。\n");return;}for (int i = pos; i < ct->size; i++){CTAss(ct->sqlist + i, ct->sqlist + i + 1);}ct->size--;printf("删除成功!\n");
}
//查找
void CTFind(CT* ct)
{printf("请输入想要查找的联系人:\n");int pos = CTFind1(ct);printf("%-11s%-8s%-13s%-8s%-14s\n", "姓名", "年龄", "电话", "性别", "住址");printf("%-11s%-8d%-13s%-8s%-14s\n", ct->sqlist[pos].name, ct->sqlist[pos].age, ct->sqlist[pos].tel, ct->sqlist[pos].sex, ct->sqlist[pos].addr);
}
//修改
void CTVice(CT* ct)
{printf("请输入要修改的联系人:\n");int pos = CTFind1(ct);if (pos == -1){printf("找不到此联系人,请检查是否输入错误。\n");return;}char type[8] = { 0 };printf("请输入要修改的数据类型:\n");scanf("%s", type);if (!strcmp(type, "姓名")){printf("请输入要修改的姓名:\n");char tmp_name[NAME_MAX] = { 0 };scanf("%s", tmp_name);for (int i = 0; i < NAME_MAX; i++)(ct->sqlist+pos)->name[i] = tmp_name[i];CTSort(ct);}else if (!strcmp(type, "年龄")){printf("请输入要修改的年龄:\n");int tmp_age = 0;scanf("%d", &tmp_age);(ct->sqlist+pos)->age = tmp_age;}else if (!strcmp(type, "电话")){printf("请输入要修改的电话:\n");char tmp_tel[TEL_MAX] = { 0 };scanf("%s", &tmp_tel);for (int i = 0; i < TEL_MAX; i++)(ct->sqlist+pos)->tel[i] = tmp_tel[i];}else if (!strcmp(type, "性别")){printf("请输入要修改的性别:\n");char tmp_sex[SEX_MAX] = { 0 };scanf("%s", tmp_sex);for (int i = 0; i < SEX_MAX; i++)(ct->sqlist+pos)->sex[i] = tmp_sex[i];}else if (!strcmp(type, "住址")){printf("请输入要修改的住址:\n");char tmp_addr[ADDR_MAX] = { 0 };scanf("%s", tmp_addr);}else{printf("输入错误\n");}
}
//test.c
void menu()
{printf("**************************************\n");printf("*****1.添加联系人    2.删除联系人*****\n");printf("*****3.查找联系人    4.修改联系人*****\n");printf("*****5.查看联系人    0.  退  出  *****\n");printf("**************************************\n");
}int main()
{CT contect1;CTInit(&contect1);int choice = 1;do{menu();printf("请输入你要做的选项:\n");scanf("%d", &choice);switch (choice){case 1:CTAdd(&contect1);break;case 2:CTDel(&contect1);break;case 3:CTFind(&contect1);break;case 4:CTVice(&contect1);break;case 5:CTCheck(&contect1);break;case 0:CTDestroy(&contect1);break;default:printf("输入错误,请重新输入:\n");break;}} while (choice);return 0;
}

顺序表的问题及思考

  1. 中间/头部的插入删除,时间复杂度为O(N)。
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

思考:如何解决以上问题呢?

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

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

相关文章

Spring Boot后端与Vue前端融合:构建高效旅游管理系统

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

设计模式- 建造者模式(Builder Pattern)结构|原理|优缺点|场景|示例

目录 设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型 适配器模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种创…

【网络编程】TCP流套接字编程(TCP实现回显服务器)

一.TCP流套字节相关API. Socket(既能给客户端使用,也能给服务器使用) 构造方法 基本方法: ServerSocket(只能给服务器使用) 构造方法: 基本方法: 二.TCP实现回显服务器. 客户端代码示例: package Demo2;import java.io.IOException; import java.io.InputStream; import j…

【AI 测试】自然语言处理(NLP)类项目如何测试

目录 NLP类项目需要的技能针对NLP领域大模型的评测任务及评价指标设计如何开展测试一、准确性评测实例二、稳定性评测实例三、效率评测实例四、执行测试注意事项以下是摘自某招聘网站的AI 测试工作职责: 负责NLP等领域大模型评测任务及评价指标的设计与制定;跟进业内大模型技…

一个char类型数字转字符串后引起的惨案

问题现象 嵌入式开发平台&#xff0c;交叉编译链比较老&#xff0c;还不支持 C11 的 to_string 写法&#xff0c;此时想通过模板方式&#xff0c;构造一个通用的 toString 接口&#xff0c;采用了 ostringstream &#xff0c;就出现了问题。 模板接口如下 template <type…

2 逻辑斯蒂回归(分类)

目录 1 理论 逻辑回归假设数据服从伯努利分布&#xff08;二分类&#xff09;,通过极大化似然函数的方法&#xff0c;运用梯度下降来求解参数&#xff0c;来达到将数据二分类的目的。 逻辑斯蒂回归&#xff08;Logistic Regression&#xff09;是一种用于解决分类问题的…

esp32-通过wifi使用timelib库同步时间(三)

库的安装 本文基于platformIO&#xff0c;安装较为简单如下图 实例代码 完整代码如下&#xff0c;如果时间获取超时请使用time1.aliyun.com获取时间。 /** Time_NTP.pde* Example showing time sync to NTP time source** This sketch uses the Ethernet library*/#include …

Kafka入门介绍+集群部署+简单使用

Kafka入门介绍集群部署简单使用 简介核心概念Broker&#xff08;服务节点/实例&#xff09;Producer&#xff08;生产者&#xff09;Topic&#xff08;主题&#xff09;Partition&#xff08;分区&#xff09;Consumer&#xff08;消费者&#xff09;和Consumer Group&#xff…

shell 脚本常用 逻辑判断符 与 || 或 ! 非

shell 脚本常用 逻辑判断符 文章目录 1、&& 逻辑与2、|| 逻辑或3、! 逻辑非 – 1、&& 逻辑与 只有两个都是真&#xff0c;结果才是真 如果第一个式子为false&#xff0c;则不会执行后面 2、|| 逻辑或 一真则真 如果左端为真&#xff0c;则右端不需要再进行…

超级好用的C++实用库之字节流解析器

概述 字节流解析器是一种软件组件&#xff0c;它负责将接收到的原始二进制数据&#xff08;字节流&#xff09;转换为有意义的信息结构或格式。在计算机网络、文件处理和数据通信中&#xff0c;字节流是最基本的数据传输形式&#xff0c;但这些原始字节对于应用程序通常是没有直…

对组合模式的理解

目录 一、场景1、题目描述 【[案例来源](https://kamacoder.com/problempage.php?pid1090)】2、输入描述3、输出描述4、输入示例5、输出示例 二、实现&#xff08;假的组合模式&#xff09;1、代码2、为什么上面的写法是假的组合模式&#xff1f; 三、实现&#xff08;真的组合…

文本生成任务的评价方法BLEU 和 ROUGE

BLEU 是 2002 年提出的&#xff0c;而 ROUGE 是 2003 年提出的。这两种指标虽然存在着一些问题&#xff0c;但是仍然是比较主流的评价指标。 BLUE BLEU 的全称是 Bilingual evaluation understudy&#xff0c;BLEU 的分数取值范围是 0&#xff5e;1&#xff0c;分数越接近1&a…

使用new 关键字调用函数,创建对象的过程中做了什么

使用new 关键字调用函数&#xff0c;创建对象的过程中做了什么 使用 new关键字创建对象的过程大致可以分为以下几个步骤&#xff1a; 创建空对象&#xff1a;首先&#xff0c;new操作符会创建一个空对象&#xff0c;这个对象的隐式原型__proto__属性会被设置为构造函数的显示原…

YOLOv9改进策略 | 细节创新篇 | 迭代注意力特征融合AFF机制创新RepNCSPELAN4

一、本文介绍 本文给大家带来的改进机制是AFF&#xff08;迭代注意力特征融合&#xff09;&#xff0c;其主要思想是通过改善特征融合过程来提高检测精度。传统的特征融合方法如加法或串联简单&#xff0c;未考虑到特定对象的融合适用性。iAFF通过引入多尺度通道注意力模块(我…

搭建vue3组件库(一):Monorepo项目搭建

Monorepo Monorepo 是一种项目代码管理方式&#xff0c;指单个仓库中管理多个项目&#xff0c;有助于简化代码共享、版本控制、构建和部署等方面的复杂性&#xff0c;并提供更好的可重用性和协作性。 pnpm pnpm 全称 performant npm&#xff0c;意思为 高性能的 npm。pnpm 由…

mysql面试题六(视图,存储过程,触发器)

目录 1.什么是视图 视图的特点 视图的创建与使用 视图的用途与优势 注意事项 2.什么是存储过程 存储过程的特点 存储过程的创建与调用 存储过程的使用场景 注意事项 3.什么是触发器 触发器的特点 触发器的创建与管理 触发器的使用场景 注意事项 1.什么是视图 在…

算法打卡day52|单调栈篇03| 84.柱状图中最大的矩形

算法题 Leetcode 84.柱状图中最大的矩形 题目链接:84.柱状图中最大的矩形 大佬视频讲解&#xff1a;84.柱状图中最大的矩形视频讲解 个人思路 这题和接雨水是相似的题目&#xff0c;原理上基本相同&#xff0c;也是可以用双指针和单调栈解决&#xff0c;只是有些细节不同。…

深度学习之目标检测从入门到精通——json转yolo格式

记录点&#xff1a; import json import osname2id {person:0,helmet:1,Fire extinguisher:2,Hook:3,Gas cylinder:4}def convert(img_size, box):dw 1./(img_size[0])dh 1./(img_size[1])x (box[0] box[2])/2.0 - 1y (box[1] box[3])/2.0 - 1w box[2] - box[0]h box…

23种设计模式之行为模式篇

三、行为模式 这类模式主要关注对象之间的通信&#xff0c;尤其是它们之间进行通信的方式和时机。 包括&#xff1a; 策略模式&#xff08;Strategy&#xff09;模板方法模式&#xff08;Template Method&#xff09;观察者模式&#xff08;Observer&#xff09;迭代器模式&…

jtop安装

一、安装依赖环境 sudo apt-get install git cmake sudo apt-get install python3-dev sudo apt-get install libhdf5-serial-dev hdf5-tools sudo apt-get install libatlas-base-dev gfortran二、pip3安装 sudo apt-get update sudo apt-get upgrade sudo apt-get install …