address list(dynamic)- 通讯录动态版本
#define max_tele 12
#define max_addr 30 // 方便修改 参数
enum option
{
Exit,// 0
Add,// 1
Del,// 2
Search,// 3
Modification,//4
Show,// 5
Sort// 6
};
struct people
{
char name[max_name];
int age;
char sex[max_sex];
char telephone[max_tele];
char address[max_addr];
};
// 通讯录类型
struct contact
{
// 这里实现的是一个结构体嵌套
//struct people data[max];// 那么这里就不能这么写了。
struct people* data; 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 // 有的人可能会说用柔性数组,柔性数组 比 替代方法
// 但是 我们这 需要 malloc 开辟一次空间,不涉及多次开辟
// 所以这里我们是使用 替代方法
// 创建一个指针 来接收 我们 开辟的动态空间地址
int size;// 记录当前已经有的元素个数
};
[](()修改二(初始化修改):
[](()原来的初始化:
[](()改进初始化:
好的,让我们来通过程序注释,来解释一下为什么要这么该
void initcontact(struct contact* ps)
{
assert(ps);// 判断指针 是否 空指针,原先的忘记加了 == ,勤快的人可以自己加上
ps->data = (struct people*)malloc(SZ , (sizeof(struct people))); // malloc 开辟一个动态空间,并将其地址赋给 结构体指针变量 data。
if (ps->data == NULL)// 判断 malloc 函数 开闭动态空间 是否成功
{
return;// 不成功,我们什么也做不了(啥事都不干)
}
else
{// 开辟成功
ps->size = 0;// size 初始化; size: 记录当前存储了 几个元素
ps->capacity = SZ; // 初始化 容量 为 3
}
}
[](()修改三(函数功能修改):
int main()
{
int input = 0;
// 创建一个通讯录
struct contact contact;// contact 就是通讯录,里面 包含 data 指针, size,capacity
//初识化 通讯录
initcontact(&contact);// 把 结构体数组 初始化为 0,只有传址,才能改变 contact 的值
//
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case Add:
add_contact(&contact);// 增加一个通讯录信息函数
// 涉及容量更改,实现函数的定义,需做修改
break;
case Del:
del_contact(&contact);//不涉及 容量 更改,不用修改
break;
case Search:
search_contact(&contact);//不涉及 容量 更改,不用修改
break;
case Modification:
modification_contact(&contact);//不涉及 容量 更改,不用修改
break;
case Show:
show_contact(&contact);//不涉及 容量 更改,不用修改
break;
case Sort:
sort_contact(&contact);//不涉及 容量 更改,不用修改
break;
case Exit:
Destroy_Contact(&contact);// 开辟了 动态 空间,就会有释放空间
// 所以在退出通讯录之前,销毁通讯录(释放动态开辟的空间)
// 故 我们 要在这里加一个 销毁通讯录 的功能
printf("退出通讯录\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
[](()修改三(函数功能修改)- add:
[](()原 add 函数实现:
[](()修改后的 add:
void CheckCapacity(struct contact* ps)
{
if (ps->capacity == ps->size)// 存储数据的个数 等于 容量,说明容量满了
{
// 增容: 使用 realloc 函数 “扩展空间”
struct people* ptr = (struct people *)realloc(ps->data, (ps->capacity + 2)*sizeof(struct people));
if (!ptr)// 判断 realloc "扩展空间" 是否成工本费
// ptr == NULL == 0 (开辟失败)为假, !(取反) 变为 1 ,即为真,执行 if 语句
{
printf("增容失败\n");
}
else
评论