✨ 写在前面
哈喽 大家好
作为一个初入编程的大学生,知识浅薄,但还是要学习大佬写一下前言滴()
我的其他文章
1.【C语言】字符串函数使用+模拟【上】
2.【C语言】彻底搞明白C语言一大关卡—C指针【初阶】
3.【C语言】字符串操作函数&&字符串查找&&内存操作函数【下】初入编程的世界 前方"路漫漫"️ 每天我们都要进步一点点
希望分享知识的同时可以和你们一起进步
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
目录
1.动态通讯录
通讯录的初始化
增加联系人
2.文件版本通讯录
初始化通讯录
保存通讯录
之前,完成了通讯录的静态版本
➡️➡️【C语言】通讯录--静态版本
不过静态版本存在一定的缺陷,我们定义的只可以存储1000个人的信息,并且如果存放的人数过少,会造成一定的空间浪费
所以我们考虑实现动态版本,可以对存放的空间进行扩容,这样减少了一定的空间浪费
而如果变成动态版本,定义的结构体就需要发生变化
静态数组改用成动态开辟空间!
然后需要改动的就是
之前的静态版本 ,我们是这样初始化的:
定义了一个 data数组 然后再 初始化结构里利用memset直接把数组所有元素置0
但是我们改成动态版本,没有定义静态数组,而是需要动态开辟一个数组
那么这个工作就需要在初始化接口函数里面实现
如图所示:
我们在InitContact函数里面 动态开辟了一个data数组
然后给通讯录的最大容量一个默认值:DEFAULT_SZ --(宏定义为3)
静态通讯录版本中,增加联系人我们是这样做的
但是动态的如何实现呢?
分析:
- 首先检查是不是需要扩容(是不是已经存放满了)
- 如果需要扩容,那么利用一个封装函数,realloc一下实现扩容
- 然后也是录入信息即可
realloc进行扩大空间的时候 ,首先判断是不是扩容成功,如果扩容成功再把扩容成功的临时地址ptr 赋值给原来的空间地址-(pc->data)
这样 动态增长的通讯录就完成了!
如果文件的相关操作可以回去看一下这篇文章哦:
➡️【C语言】文件操作详解(保姆级教程)
上面我们把静态通讯录改成了动态版本
但是还存在一些问题,那就是,每一次运行文件都需要重新录入联系人信息
我们想要实现的功能:
那么如何实现呢?
首先我们考虑 需要修改哪些部分的接口
初始化的时候,
1.首先像动态版本一样,先动态开辟好初始空间
2.然后建立一个临时结构体,利用fopen读取文件到临时结构体中,如果读取成功就赋值给我动态开辟好的通讯录里的当前位置
把目前的通讯录中data数组的每一个元素都保存到文件contact.dat中
然后只需要在退出的时候,调用一下保存函数接口就可以了
这样 文件版本的通讯录就完成了(其他部分不用修改)