IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言实现通讯录(静态和动态两种方式) -> 正文阅读

[C++知识库]C语言实现通讯录(静态和动态两种方式)

前言
在c语言学习了关于如何使用结构体以及动态内存管理之后,便掌握了实现通讯录的方法,接下来就是我实现通讯录的具体过程和经验总结。
通讯录分为静态和动态实现两种方式。

静态实现:
?

实现一个通讯录;

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

添加联系人信息
删除指定联系人信息
查找指定联系人信息
修改指定联系人信息
显示所有联系人信息
清空所有联系人


首先,先定义一个结构体存放个人信息:
(这里用到了typedef自定义类型A,借用A代替struct A)
接着要完成1000个人的存储,所以要再定义一个结构体,里面存放关于结构体A的数组
可以看到前面用用A代替struct A,在这里直接创建A类型的数组也就是结构体A的数组,里面包含1000个元素,用来存放1000个人的信息。
同时,这里也将struct B类型的结构体名用typedef来转换成B直接代替。
接着就是建立一个名为CON的struct B类型的变量来作为通讯录
由于要进行CON通讯录内容的修改,将CON地址传入初始化函数和通讯录创建的函数,然后初始化
传入的CON地址用B*类型的指针也就是struct B*类型的指针来接收,此时可以对CON的内容进行修改,调用memset函数(包含头文件<string.h>)来初始化数组里面的1000个元素为0。


接下来就是通讯录的具体实现框架:

思路是:先用一个do-while结构将具体实现内容包含进去,然后创建一个整形变量n用来接收使用者输入进去的数字,再用switch来接收数字,跳转到数字所对应的内容。


首先看到添加信息函数

这里需要特别关注的是年龄的输入,因为只有年龄是整形类型的变量,其余的信息都是字符串来接收,故这里需要加一个取地址符号,以及这里需要用“->”来访问pc里面的成员(也就是struct B)data在用“ .”来访问(struct A)里面的成员。
然后再访问pc里面的成员count来进行数量上的添加,即每添加一个成员就count加一。


接下来是删除信息函数:

这里通过查找需要删除的人的姓名来进行删除,查找方法是调用strcmp函数来判断所输入的name与之前创建的是否一致,若一致便进入一个for循环,将需要删除的人的信息进行覆盖,从后往前覆盖,也就是将这个需要删除的人的信息由后面的人的信息依次向前移动,达到覆盖。最后再将后面向前移动的人的信息初始化为0,达到删除所需要删除的人的信息的目的。
?

接下来就是查找联系人信息的函数:


与删除联系人信息类似的,同样是建立一个字符数组来接收所要查找的人的姓名,通过strcmp来比对,找到了便返回数值0,然后将信息用printf来输出。若没有找到则打印“没有找到,重新输入”。


接下来是修改联系人的某个信息:



这里首先运用与前面函数类似方法接收姓名,进行查找再进入switch-case里面进行个人信息的具体修改。
并放在一个循环体内进行,为了能在输入错误时不断提示需要修改的信息。

接下来是显示所有人的信息
唯一需要强调的一点便是这里用了if语句来判断里面成员是否为0,目的是为了和前面删除某个联系人信息后初始化最后几位联系人信息为0的时候不打印出来该初始化为0后的人的信息。

最后便是清空所有人的信息




实现效果

界面



输入联系人信息


打印所有人信息


删除某个人信息


?

查找某个人信息



修改某个人的某个信息



动态实现

这里动态实现和静态实现大致一样,主要差别在于这里不再建立含有1000个元素的结构体数组,而是创建一个结构体指针,当需要创建新的联系人的时候便开辟动态内存空间,这样子便可以使得通讯录占用内存更加合理、节省空间,在不需要使用的内存的时候也不会占用过多空间。

(静态实现版本)

?

?新的struct B类型结构体:(动态实现版本)

这里在结构体B中新建立了一个cap整形变量,用来记录动态开辟的内存大小,便于后面添加联系人后判断是否需要继续开辟动态内存。

初始化通讯录:


在这里在堆区开辟动态内存,开辟三个A类型的内存用来存储联系人。


?


添加联系人信息函数(动态实现版本)
?

这里就出现了前面提到了新建立cap整形变量的意义,用来判断已经添加的联系人和已经开辟的动态内存大小进行比较,若相等则需要继续开辟空间:

继续开辟空间的check函数实现:

调用realloc函数来进行扩容,若申请成功则赋值给pc->data指针。

其他关于删除,打印所有联系人信息,修改信息都是和静态类型一致的。

另一个不同的便是申请完空间或者使用完通讯录后需要free,释放掉申请的内存空间,再将一开始的data指针赋值NULL避免生成野指针。



以上便是通讯录的两种实现形式,分别为静态实现和动态实现,总的来说我认为动态实现更贴切需求,需要添加信息才开辟空间,避免了静态实现的开辟了空间可能因为而不用造成浪费。

?

?



?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:01:01  更:2022-02-03 01:03:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:50:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码