C语言实现通讯录(动态版本)

目录

0.前言

1.动态改造

1.1结构体改造

1.2初始化函数改造

1.3扩容函数

1.4内存释放

2.文件存储:

2.1数据读入

2.2文件写入

3.代码概览

3.1源

3.2function.h

3.3function.cpp

4.结语


0.前言

本篇是对通讯录进行的动态改造。静态原型原型在我的上一篇文章中,跳转链接:逐步分析C语言实现通讯录(内有结构体基础讲解和qsort基本使用方法讲解)_wsyjpgs的博客-CSDN博客

本次我们将实现动态内存存储,以及文件的存储。


1.动态改造

1.1结构体改造

如果我们要进行动态的改造,那么就必须对静态定义的结构体进行改造

我们知道动态内存是由指针进行维护的,所以我们要将Arr改为指针变量。还有就是动态内存的最大存放量是会改变的,所以我们要定义一个量来存放当前的最大值

当然啦,动态内存就得有初始容量和后续扩大的容量,所以这里我宏定义了两个常量。

 万事俱备我们现在可以正式开始改造啦。


1.2初始化函数改造

既然我们的数据要改成动态存储,我们的初始化就不能是静态的初始化了。这里我们对这个代码进行改造:

改造后:

 这里稍微解释一下,calloc函数,这里就是开辟了DEF_SZ个communication大小的内存。

ptr变量的引用是用来判断是否开辟成功的。


1.3扩容函数

上文我们把内存成功改成了动态的,那么我们的数据检查函数是不是也要进行对应的修改。

 现在我们来到Add函数中

制作静态版本的时候是不是数据满了就不能放入数据了。那么动态版本显然就不能这样做,动态内存不够了,是不是要进行扩容啊,所以需要进行扩容操作.

 声明:

 实现:

 这里的realloc函数的参数我解释一下:Cur_max是原来数据的最大量,ADD_SZ是扩容的大小,所以两个加起来就是新的大小。

这里用ptr接收而不用Arr直接接收的原因是:万一扩容失败了,返回的是NULL如果这里直接用Arr进行接收,会导致原来的数据丢失,也会导致旧的内存没有指针维护导致内存泄漏。


1.4内存释放

上面的改造我们完成了,现在进行测试一下:

 我们这里发现已经实现了。

接下来我们就要实现内存的释放。那么我们什么时候需要释放呢?一共是两个地方:第一个地方自然是退出通讯录的时候需要释放;第二个地方是clear的时候,我们需要把之前的数据释放,才可以重新初始化。

 

 声明:

实现:

 

 这里我就不过多赘述哩,因为这个就是释放的标准过程,我只是封装成一个函数而已。


2.文件存储:

我们在上文实现了动态内存存储,可是数据还是只能存在内存中,我们无法对数据进行持久化存储。接下来我们就要写一些函数来实现数据的读取和写入。


2.1数据读入

我这里打算的是,在每次启动软件时自动读取数据。所以我在初始化函数后加上了读取函数。

声明:

实现:

 

这里简单讲解一下while循环:这里就是多组读入,当文件读到末尾时会返回EOF给fscanf也就是返回-1,而-1按位取反是0,所以这里用这个循环读取数据。然后把数据判断放到函数中,对动态内存进行及时扩容。


2.2文件写入

我这里的想法是在程序退出时,对内存中的数据进行自动保存。

声明:

 

 实现:

 这里没有什么需要说明的,就是将内存中的数据一个一个写入文件。


3.代码概览

3.1源

 


3.2function.h

 


3.3function.cpp

 


4.结语

到这里,我们的通讯录就全部完成了,感谢大家的浏览

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值