【C语言】通讯录
创始人
2025-06-01 04:26:23
0

目录

  • 1.缕清实现思路
  • 2. 代码实现
    • 1.1 通讯录初始化
    • 1.2 添加联系人
    • 1.3 打印通讯录
    • 1.4 删除联系人
    • 1.5 查找联系人
    • 1.6 修改联系人
    • 1.7 通讯录排序
    • 1.8 清空通讯录
  • 2. 总结

1.缕清实现思路

实现一个通讯录;

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
(容量这里使用动态内存实现)

可执行操作:

add 添加联系人信息
delete 删除指定联系人信息
search 查找指定联系人信息
modify 修改指定联系人信息
show 显示所有联系人信息
clear 清空所有联系人
sort 以名字排序所有联系人

这里动态实现的通讯录本质上是一种动态顺序表

2. 代码实现

操作指引部分使用枚举将输入于相应操作一一列举
增加代码可读性

enum option
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT,CLEAR
};

自定义结构体类型,存储联系人信息

typedef struct PeoInfo
{char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_ADDR];
}PeoInfo;typedef struct Contact
{PeoInfo* data;int sz;//通讯录中有效信息的个数int capacity; //通讯录的容量
}Contact;

1.1 通讯录初始化

使用malloc申请动态内存空间,并使用memset将初始值置为0

void InitContact(Contact* pc)
{pc->data = (PeoInfo*)malloc(DEFAULT_SIZE * sizeof(PeoInfo));if (pc->data == NULL){printf("malloc fail\n");exit(-1);}else{memset(pc->data, 0, DEFAULT_SIZE * sizeof(PeoInfo));pc->sz = 0;}pc->capacity = DEFAULT_SIZE;//#define定义的初始容量
}

1.2 添加联系人

void AddContact(Contact* pc)
{CheckCapacity(pc);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++;
}

1.3 打印通讯录

为使打印出的通讯录各列对齐,通过格式控制字符串调整对齐方式和域宽

void ShowContact(Contact* pc)
{printf("%-20s %-5s %-5s %-12s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-20s %-5d %-5s %-12s %-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}

1.4 删除联系人

通过输入判断删除项,封装一个FindByName函数通过输入的姓名返回其所处位置下标
FindByName后续操作也会经常用到
删除操作时,待删除位置的后数据以此前移一位即可实现删除

int FindByName(Contact* pc, char* str)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, str) == 0){return i;//找到返回位置下标}}return -1;//找不到返回-1
}void DeletContact(Contact* pc)
{char str[MAX_NAME] = { 0 };printf("请输入需删除的联系人姓名->");scanf("%s", str);int pos = FindByName(pc, str);while (pos < pc->sz - 1){//待删除位置的后数据以此前移一位即可实现删除pc->data[pos] = pc->data[pos + 1];pos++;}pc->sz--;
}

1.5 查找联系人

同样使用FindByName返回查找位置的下标
同时将查找的信息打印

void SearchContact(Contact* pc)
{char str[MAX_NAME] = { 0 };printf("请输入需查找的联系人姓名->");scanf("%s", str);int pos = FindByName(pc, str);printf("%-20s %-5s %-5s %-12s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%-20s %-5d %-5s %-12s %-20s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);
}

1.6 修改联系人

一段又臭又长的输入输出函数

void ModifyContact(Contact* pc)
{char str[MAX_NAME] = { 0 };printf("请输入需修改的联系人姓名->");scanf("%s", str);int pos = FindByName(pc, str);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("修改成功\n");ShowContact(pc);
}

1.7 通讯录排序

使用qsort函数根据姓名进行排序,注意比较函数中的指针类型转换为(PeoInfo*)

int cmp_by_name(const void* p1, const void* p2)
{return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
}void SortContact(Contact* pc)
{qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);printf("排序成功\n");ShowContact(pc);
}

1.8 清空通讯录

傻瓜式清空

void ClearContact(Contact* pc)
{pc->sz = 0;printf("通讯录已清空\n");
}

2. 总结

此没有结合文件操作的通讯录完全是个半成品

上一篇:Linux chattr命令

下一篇:IO流之字节流

相关内容

热门资讯

新城控股王晓松:2026年公司... 中经记者 杨让晨 石英婧 上海报道“2026年,是国家‘十五五’规划的开局之年,也是新城的关键一年。...
新势力车企2025年成绩单:大... 红星资本局1月1日消息,2026年1月1日,新势力车企陆续公布了2025年全年的销售成绩单。红星资本...
《燕梳师院》盘点2025年中国... 2025年,中国保险业迈入高质量发展的关键转型期,“十五五”规划的开局为行业注入新动能。在科技赋能、...
《燕梳师院》发布2025年世界... 2025年,全球保险业在政策调控、市场整合、科技转型与风险应对等多维度迎来深度变革。从主要经济体的监...
岁末年初,国家拿出真金白银! 文/王恩博岁序更替之际,市场高度关注中国经济政策如何衔接。抓住这一关键时间窗口,近期各方面靠前发力,...
中国医药两家子公司补税6521... 中经记者 晏国文 卢志坤 北京报道2026年1月1日,中国医药(600056.SH)披露,下属全资子...
中国同辐子公司补缴税款2.71... 中经记者 晏国文 卢志坤 北京报道2025年12月31日,港股上市公司中国同辐(1763.HK)披露...
中国军号发布军事演习主题海报《... 本文转自【中国军号微博】; 中国人民解放军打“独”促统决不手软,将持续组织反分裂反干涉行动,坚决维护...
利空突袭!暴跌50%! 美股及印度股市,均有突发消息传来!北京时间2026年1月1日凌晨,在美股市场上,生物制药公司Corc...
两度出手全资控矿!盛新锂能拟2... 微成都报道12月30日晚间,盛新锂能(002240.SZ)发布公告称,公司拟通过全资子公司四川盛屯锂...