C语言实现通讯录(静态和动态两种方式)
前言 在c语言学习了关于如何使用结构体以及动态内存管理之后,便掌握了实现通讯录的方法,接下来就是我实现通讯录的具体过程和经验总结。 通讯录分为静态和动态实现两种方式。 静态实现:
实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
接下来就是查找联系人信息的函数:
与删除联系人信息类似的,同样是建立一个字符数组来接收所要查找的人的姓名,通过strcmp来比对,找到了便返回数值0,然后将信息用printf来输出。若没有找到则打印“没有找到,重新输入”。 接下来是修改联系人的某个信息:
这里首先运用与前面函数类似方法接收姓名,进行查找再进入switch-case里面进行个人信息的具体修改。 并放在一个循环体内进行,为了能在输入错误时不断提示需要修改的信息。 接下来是显示所有人的信息 唯一需要强调的一点便是这里用了if语句来判断里面成员是否为0,目的是为了和前面删除某个联系人信息后初始化最后几位联系人信息为0的时候不打印出来该初始化为0后的人的信息。 最后便是清空所有人的信息 实现效果 界面 输入联系人信息
打印所有人信息 删除某个人信息
查找某个人信息 修改某个人的某个信息 动态实现 这里动态实现和静态实现大致一样,主要差别在于这里不再建立含有1000个元素的结构体数组,而是创建一个结构体指针,当需要创建新的联系人的时候便开辟动态内存空间,这样子便可以使得通讯录占用内存更加合理、节省空间,在不需要使用的内存的时候也不会占用过多空间。 (静态实现版本)
新的struct B类型结构体:(动态实现版本) 这里在结构体B中新建立了一个cap整形变量,用来记录动态开辟的内存大小,便于后面添加联系人后判断是否需要继续开辟动态内存。 初始化通讯录: 在这里在堆区开辟动态内存,开辟三个A类型的内存用来存储联系人。
添加联系人信息函数(动态实现版本)
这里就出现了前面提到了新建立cap整形变量的意义,用来判断已经添加的联系人和已经开辟的动态内存大小进行比较,若相等则需要继续开辟空间:
继续开辟空间的check函数实现:
调用realloc函数来进行扩容,若申请成功则赋值给pc->data指针。 其他关于删除,打印所有联系人信息,修改信息都是和静态类型一致的。
另一个不同的便是申请完空间或者使用完通讯录后需要free,释放掉申请的内存空间,再将一开始的data指针赋值NULL避免生成野指针。 以上便是通讯录的两种实现形式,分别为静态实现和动态实现,总的来说我认为动态实现更贴切需求,需要添加信息才开辟空间,避免了静态实现的开辟了空间可能因为而不用造成浪费。