写点什么

address list(dynamic)- 通讯录动态版本

  • 2022 年 5 月 01 日
  • 本文字数:1410 字

    阅读完需:约 5 分钟

#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

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
address list(dynamic)- 通讯录动态版本_Java_爱好编程进阶_InfoQ写作社区