C语言动态与静态分别实现通讯录的方法
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,这篇文章主要讲解了"C语言动态与静态分别实现通讯录的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C语言动态与静态分别实现通讯录的方法"吧!一.静
千家信息网最后更新 2025年11月14日C语言动态与静态分别实现通讯录的方法
这篇文章主要讲解了"C语言动态与静态分别实现通讯录的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C语言动态与静态分别实现通讯录的方法"吧!
一.静态通讯录的实现
1.环境的分工逻辑
由于过程有点长,便于理解,所以一共会用到三个文件
分别是两个源文件test.c、contact.c ,还有一个头文件contact.h来实现
test.c是主体,是通讯录的测试逻辑
contact.c是通讯录的实现逻辑
contact.h是实现通讯录函数的声明
2.待实现的功能
通讯录的每一个功能是相对独立的
所以可以分别用不同的函数来实现各个部分的功能
contact.c包含的函数分别以下内容:
1.结构体的初始化
2.添加联系人
3.展示联系人
4.删除联系人
5.查找联系人
6.修改联系人
具体代码如下:
3.contact.h
#define _CRT_SECURE_NO_WARNINGS 1#include#include //通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址typedef struct Introduction{ char name[20]; char sex[10]; int age; char tele[20]; char addr[30];} Introduction;typedef struct contact{ Introduction data[1000]; int sz;}contact; //结构体的初始化void Initcontact(contact* pc);//添加联系人void Add(contact* pc);//展示联系人void show(contact* pc);//删除联系人void Dele(contact* pc);//查找联系人void Find(contact* pc);//修改联系人void Exchange(contact* pc);
4.contact.c
#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"void Initcontact(contact* pc)//结构体的初始化{ pc->sz = 0; memset(pc->data, 0, sizeof(pc->data));} void Add(contact* pc)//添加联系人{ //判断是否未满 if (pc->sz == 1000) { printf("通讯录已满\n"); return; } printf("请输入名字>:"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄>:"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("增加联系人成功\n");} void show(contact* pc)//展示联系人{ int i = 0; printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < pc->sz; i++) { printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); }} int SearchByName(contact* pc, char name[]){ int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1;} void Dele(contact* pc)//删除联系人{ int i = 0; char name[10]; printf("输入要删除人的名字>:\n"); scanf("%s", name); if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); } //判断是否有联系人 int pos = SearchByName(pc, name); if (pos == -1) { printf("找不到联系人\n"); } else { for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除联系人成功\n"); }} void Find(contact* pc)//查找联系人{ char name[10]; printf("输入要查找人的名字>:\n"); scanf("%s", name); int pos = SearchByName(pc, name); if (pos == -1) { printf("通讯录中无查找人的名字"); } else { printf("查找的人信息为:>"); printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年龄", "性别", "电话", "地址"); printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }} void Exchange(contact* pc)//修改联系人{ char name[10]; printf("输入要修改人的名字>:\n"); scanf("%s", name); int pos = SearchByName(pc, name); if (pos == -1) { printf("通讯录中无修改人的名字"); } else { printf("请输入名字>:"); scanf("%s", pc->data[pos].name); printf("请输入年龄>:"); scanf("%d", &(pc->data[pos].age)); printf("请输入性别:>"); scanf("%s", pc->data[pos].sex); printf("请输入电话:>"); scanf("%s", pc->data[pos].tele); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功"); }}5.test.c
#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"void menu(){ printf("**********************************************\n"); printf("******* 1.Add 2.Dele *********\n"); printf("******* 3.Find 4.Exchange **********\n"); printf("******* 5.show 0.exit **********\n"); printf("**********************************************\n");}int main(){ int input = 0; contact con; Initcontact(&con); do { menu(); printf("请输入一个数>:"); scanf("%d", &input); switch (input) { case 1: Add(&con); break; case 2: Dele(&con); break; case 3: Find(&con); break; case 4: Exchange(&con); break; case 5: show(&con); break; case 0: printf("退出通讯录\n"); break; default: printf("选择错误\n"); } } while (input); return 0;}6.实现效果
二.通讯录动态的实现
相较于静态的实现,两者的差别并不大
前者是用一个固定数组来实现元素的储存
后者则是用动态申请的内存来实现储存,优点是可以节省内存
区别在于
通讯录的初始化,这里引用了capcity容量来比较已有的容量
来判断内存的使用量,便于扩容
其次就是Add函数,增加联系人
最后再对释放的内存进行释放
代码如下:
1.contact.h
#define _CRT_SECURE_NO_WARNINGS 1#include#include #include #include typedef struct Introduction{ char name[20]; char sex[10]; int age; char tele[20]; char addr[30];}Introduction; typedef struct contact{ Introduction* data; int sz; int capcity;}contact; //结构体的初始化void Initcontact(contact* pc);//添加联系人void Add(contact* pc);//展示联系人void show(contact* pc);//删除联系人void Dele(contact* pc);//查找联系人void Find(contact* pc);//修改联系人void Exchange(contact* pc);//销毁通讯录void destroy(contact*pc);
2.contact.c
#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"#define TARGET_sz 3 //初始通讯录目标容量 void Initcontact(contact* pc)//结构体的初始化{ assert(pc);//判断指针的有效性 pc->sz = 0; contact* tmp = 0; tmp=(contact*)malloc(sizeof(Introduction)*TARGET_sz); if (tmp!=NULL) { pc->data = tmp; } else { printf("扩容失败,请检查原因\n"); return; } pc->capcity = TARGET_sz;} void Add(contact* pc)//添加联系人{ assert(pc); if (pc->capcity == pc->sz) { Introduction* tmp = 0; tmp=(Introduction*)realloc(pc->data,sizeof(Introduction)*(pc->capcity+2)); if (tmp != NULL) { pc->capcity += 2; pc->data = tmp; printf("扩容成功\n"); } else { printf("扩容失败,请检查原因\n"); } } printf("请输入名字>:"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄>:"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("增加联系人成功\n");} void show(contact* pc)//展示联系人{ int i = 0; printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < pc->sz; i++) { printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); }} int SearchByName(contact* pc, char name[]){ int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1;} void Dele(contact* pc)//删除联系人{ int i = 0; char name[10]; printf("输入要删除人的名字>:\n"); scanf("%s", name); if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); } //判断是否有联系人 int pos = SearchByName(pc, name); if (pos == -1) { printf("找不到联系人\n"); } else { for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除联系人成功\n"); }} void Find(contact* pc)//查找联系人{ char name[10]; printf("输入要查找人的名字>:\n"); scanf("%s", name); int pos = SearchByName(pc, name); if (pos == -1) { printf("通讯录中无查找人的名字"); } else { printf("查找的人信息为:>"); printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年龄", "性别", "电话", "地址"); printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }} void Exchange(contact* pc)//修改联系人{ char name[10]; printf("输入要修改人的名字>:\n"); scanf("%s", name); int pos = SearchByName(pc, name); if (pos == -1) { printf("通讯录中无修改人的名字"); } else { printf("请输入名字>:"); scanf("%s", pc->data[pos].name); printf("请输入年龄>:"); scanf("%d", &(pc->data[pos].age)); printf("请输入性别:>"); scanf("%s", pc->data[pos].sex); printf("请输入电话:>"); scanf("%s", pc->data[pos].tele); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功"); }}void destroy(contact* pc){ assert(pc); free(pc->data); pc->data = NULL; pc->capcity = 0; pc->sz = 0;}3.test.c
#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"void menu(){ printf("**********************************************\n"); printf("******* 1.Add 2.Dele *********\n"); printf("******* 3.Find 4.Exchange **********\n"); printf("******* 5.show 0.exit **********\n"); printf("**********************************************\n");}int main(){ int input = 0; contact con; Initcontact(&con); do { menu(); printf("请输入一个数>:"); scanf("%d", &input); switch (input) { case 1: Add(&con); break; case 2: Dele(&con); break; case 3: Find(&con); break; case 4: Exchange(&con); break; case 5: show(&con); break; case 0: destroy(&con); printf("退出通讯录\n"); break; default: printf("选择错误\n"); } } while (input); return 0;}感谢各位的阅读,以上就是"C语言动态与静态分别实现通讯录的方法"的内容了,经过本文的学习后,相信大家对C语言动态与静态分别实现通讯录的方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
联系人
联系
输入
通讯
通讯录
名字
年龄
性别
电话
地址
成功
动态
静态
结构
方法
语言
信息
内存
函数
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
电信数据库备份半年
温州制造软件开发项目
猪八戒怎么接软件开发
数据库日期字符串直接比较大小
联合国贸发会议数据库使用教程
如何做好企业的网络安全防护工作
数据库创建补表
数据库程序软件有哪些
沭阳进口网络技术价目表
北航网络安全和安恒信息
应急预案数据库设计
数据库查gbk编码查询出来
网络安全安全学院
国外面临的计算机网络安全问题
安卓软件开发的安全问题
云服务器是什么原因引起的
vb.net 清空数据库记录
linux服务器测速
如何保障数据库的安全
c erp软件开发
数据库表与关系模型
网络安全审查范围
电脑服务器客户端怎么找
智发科技福州互联网小镇
一般情况下一个数据库
贵州服务器电源哪家靠谱
什么是网络技术代理商
所能网络安全知识
数据库修改可以输入中文的
达梦数据库安装条件