【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)

✨ 写在前面

哈喽 大家好
作为一个初入编程的大学生,知识浅薄,但还是要学习大佬写一下前言滴()
我的其他文章
       1.【C语言】字符串函数使用+模拟【上】
       2.【C语言】彻底搞明白C语言一大关卡—C指针【初阶】
       3.【C语言】字符串操作函数&&字符串查找&&内存操作函数【下】

初入编程的世界 前方"路漫漫"️ 每天我们都要进步一点点
希望分享知识的同时可以和你们一起进步

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

 

目录

1.动态通讯录

通讯录的初始化

增加联系人

2.文件版本通讯录

初始化通讯录

保存通讯录


1.动态通讯录

之前,完成了通讯录的静态版本

➡️➡️【C语言】通讯录--静态版本

不过静态版本存在一定的缺陷,我们定义的只可以存储1000个人的信息,并且如果存放的人数过少,会造成一定的空间浪费

所以我们考虑实现动态版本,可以对存放的空间进行扩容,这样减少了一定的空间浪费

而如果变成动态版本,定义的结构体就需要发生变化

静态数组改用成动态开辟空间! 

【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)_第1张图片

然后需要改动的就是

  1. 通讯录的初始化
  2. 增加联系人

通讯录的初始化

之前的静态版本 ,我们是这样初始化的:

定义了一个 data数组 然后再 初始化结构里利用memset直接把数组所有元素置0

【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)_第2张图片

【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)_第3张图片

 但是我们改成动态版本,没有定义静态数组,而是需要动态开辟一个数组

那么这个工作就需要在初始化接口函数里面实现

 如图所示:

        我们在InitContact函数里面 动态开辟了一个data数组

        然后给通讯录的最大容量一个默认值:DEFAULT_SZ --(宏定义为3)

        然后再用memset把动态开辟数组中的内容设置为0【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)_第4张图片

增加联系人

静态通讯录版本中,增加联系人我们是这样做的

【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)_第5张图片

  1.  首先进行判断 是不是存满了
  2. 如果没满然后依次输入结构体数组sz位置的各个成员

但是动态的如何实现呢?

分析:

  1. 首先检查是不是需要扩容(是不是已经存放满了)
  2. 如果需要扩容,那么利用一个封装函数,realloc一下实现扩容
  3. 然后也是录入信息即可

【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)_第6张图片 realloc进行扩大空间的时候 ,首先判断是不是扩容成功,如果扩容成功再把扩容成功的临时地址ptr 赋值给原来的空间地址-(pc->data)【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)_第7张图片

这样 动态增长的通讯录就完成了!

2.文件版本通讯录

如果文件的相关操作可以回去看一下这篇文章哦:

➡️【C语言】文件操作详解(保姆级教程)

上面我们把静态通讯录改成了动态版本

但是还存在一些问题,那就是,每一次运行文件都需要重新录入联系人信息

我们想要实现的功能

  1. 保存输入的联系人信息
  2. 可以读取上一次输入的联系人信息

 那么如何实现呢?

首先我们考虑 需要修改哪些部分的接口

  1. 每一次运行程序,首先需要初始化,然后加载本地的文件到通讯录中
  2. 我们对通讯录进行增删改减之后 需要保存改动

初始化通讯录

初始化的时候,

        1.首先像动态版本一样,先动态开辟好初始空间

        2.然后建立一个临时结构体,利用fopen读取文件到临时结构体中,如果读取成功就赋值给我动态开辟好的通讯录里的当前位置

 【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)_第8张图片

保存通讯录

把目前的通讯录中data数组的每一个元素都保存到文件contact.dat中

然后只需要在退出的时候,调用一下保存函数接口就可以了

【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)_第9张图片

 【C语言】通讯录--动态增长版本&&文件版本(可保存到本地)_第10张图片

 这样 文件版本的通讯录就完成了(其他部分不用修改)

你可能感兴趣的:(C,c语言)