第
基于C语言打造高效通讯录的示例代码
目录准备工作初始化通讯录从文件中加载信息检查容量销毁通讯录添加联系人打印数据删除联系人查找联系人修改联系人排序通讯录保存通讯录总结本篇博客会讲解如何使用C语言实现一个通讯录。实现通讯录的过程中,会大量用到C语言的知识点,包括但不限于:函数、自定义类型、指针、动态内存管理、文件操作,这些知识点在我的其他博客中都有讲解过,欢迎大家阅读,这里就不进行系统的复习了。
先来梳理下需求:
1.通讯录能够存储的联系人的信息有:姓名、年龄、性别、电话、住址。
2.这个通讯录不能是静态的,而应该是动态的,也就是说,需要用到动态内存管理的知识。这是因为,静态的通讯录的容量是固定的,空间太大可能浪费,太小了又不够存。
3.由于当程序开始运行后,通讯录的数据是存储在内存中的,一旦程序运行结束,执行完main函数的return0;后,空间就被操作系统回收了,相当于数据就丢了。为了能够实现永久保存的效果,我们要在程序退出前,把数据保存到文件中,这又涉及到文件操作的相关知识点。
4.类似顺序表这种数据结构的基本操作,通讯录要能做到:增删查改+排序+打印,即增加联系人、删除联系人、查找联系人、修改联系人、排序联系人、打印联系人等等。
下面我们开始吧!
准备工作
以下是菜单里的一些选项,声明成枚举类型是比较合适的。
//菜单里的不同选项
enumOption
EXIT,//退出
ADD,//增加联系人
DEL,//删除联系人
SEARCH,//查找联系人
MODIFY,//修改联系人
SHOW,//显示联系人
SORT//排序
};
由于联系人的姓名、性别、电话和住址都是字符串,要存储在字符数组中,最好先声明它们的容量。
//各信息的存储容量
#defineMAX_NAME20//名字
#defineMAX_SEX5//性别
#defineMAX_TELE12//电话
#defineMAX_ADDR30//住址
我们后面在进行动态内存管理时,需要知道初始的容量和每次扩容的容量,也声明一下:
//动态内存默认存储的数据
#defineDEFAULT_SZ3
//若不够存,每次扩容的数量
#defineINC_SZ2
再声明一个结构体,表示一个人的信息,包括姓名、年龄、性别、电话、住址。
//表示一个人的信息
typedefstructPeoInfo
charname[MAX_NAME];//姓名
intage;//年龄
charsex[MAX_SEX];//性别
chartele[MAX_TELE];//电话
charaddr[MAX_ADDR];//住址
}PeoInfo;
类似数据结构中的顺序表的结构,定义一个结构体,用于存储通讯录中的信息,包括一个动态开辟的数组,数组中有效数据的个数,以及数组当前动态开辟的容量。
//通讯录
typedefstructContact
PeoInfo*data;//data指向了存放数据的空间
intsz;//记录通讯录中的有效信息个数
intcapacity;//通讯录当前的容量
}Contact;
下面我们开始实现程序的主体逻辑。先从主函数写起,把主要的功能都封装成函数:
//打印菜单
voidmenu()
printf(************************************\n);
printf(*****1.add2.del***\n);
printf(*****3.search4.modify***\n);
printf(*****5.show6.sort***\n);
printf(*****0.exit***\n);
printf(************************************\n);
intmain()
intinput=0;//存储用户输入的数据
Contactcon;//通讯录
//初始化通讯录
//加载文件的信息到通讯录中
InitContact(con);
menu();//菜单
printf(请选择:
scanf(%d,input);
switch(input)
caseADD://添加联