C语言动态与静态分别实现通讯录的方法
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要讲解了"C语言动态与静态分别实现通讯录的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C语言动态与静态分别实现通讯录的方法"吧!一.静
千家信息网最后更新 2025年01月19日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安全错误
数据库的锁怎样保障安全
数据库更改数据的sql语句例子
网络安全检查 舆情转报
进去数据库
软件开发有关的职位
数据库故障有哪些
海南上门软件开发互惠互利
tcga数据库甲基化分析
网络安全数据管理条例
无线传感网络技术课后心得
软件开发公司的文案策划
品牌网络技术推广优点
网络技术合作协议书范本
数据库发展历程01
asn航空安全数据库
网络安全公司哪家产品好
网络安全的名言有哪些
sql 查看不同数据库表
数据库基本层次结构图
监控服务器配置怎么看
重庆管理软件开发服务
海湾gst数据库
erp系统不能连接数据库
网络安全媒介素养
天津市网络安全工作培训班
网络安全汇报材料标题
二嗨租车系统用的数据库
成都软件开发哪家可靠
服务区食品安全风险数据库
从小有一颗软件开发的心
固定ip 服务器