用C语言实现一个具有下列功能的通讯录(动态版):
1.添加联系人
2.删除联系人
3.修改联系人信息
4.查找联系人
5.显示所有联系人信息
6.清空所有联系人
8.将联系人信息保存在文件中
9.加载联系人
由于验证动态分配内存是否有效,我把size(通讯录的容量大小)初始化为1了,每次扩容增加到原来容量的2倍

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <malloc.h>struct address_info
{char name[20];//姓名char sex[5];//性别char age[5];//年龄char phone[20];//电话char address[100];//地址
};
typedef struct address_info * pinfo;//将结构体指针类型命名为pinfo
int mumbers = 0;//记录联系人的总人数
int size = 1;//记录通讯录的规模大小
int sizeOfStruct = sizeof(struct address_info);//记录结构体大小
//下面都是函数声明
int namecmp(char name1[], char name2[]);
void view_someone(pinfo *address_book, int num);
int find_is(pinfo *address_book, char input_name[]);
void input_info(pinfo *address_book, int num);
void delete_info(pinfo *address_book, char input_name[], int i);
void init(pinfo *address_book);
void add_contact(pinfo *address_book);
void delete_contact(pinfo *address_book);
void find_contact(pinfo *address_book);
void modify_contact(pinfo *address_book);
void viewAll_contact(pinfo *address_book);
void emptyAll_contact(pinfo *address_book);
void sortAll_contact(pinfo *address_book);
void save_contact(pinfo *address_book);
void load_contact(pinfo *address_book);
int expandCapacity(pinfo *address_book);//[辅助函数]通讯录扩容
int expandCapacity(pinfo *paddress_book)
{pinfo p = (pinfo)realloc(*paddress_book, sizeOfStruct * (mumbers * 2));if (*paddress_book != NULL){*paddress_book = p;size = 2 * mumbers;printf("expand capacity sucessful!\n");return 1;}else{printf("failed!\n");return 0;}
}
//[辅助函数]字典序比较姓名大小
int namecmp(char name1[], char name2[])
{int result = -(strcmp(name1, name2));return result;
}
//[辅助函数]显示指定联系人
void view_someone(pinfo *address_book, int num)
{printf("姓名        性别  年龄  电话      住址\n");printf("%s     %s  %s  %s      %s\n",(*address_book)[num].name, (*address_book)[num].sex, (*address_book)[num].age,(*address_book)[num].phone, (*address_book)[num].address);
}
//[辅助函数]查找联系人是否存在
int find_is(pinfo *address_book, char input_name[])
{int i = 0;for (; i < mumbers; ++i){if (strcmp((*address_book)[i].name, input_name) == 0){return i;}}return -1;
}
//[辅助函数]写入联系人信息
void input_info(pinfo *address_book, int num)
{printf("%p\n", address_book);printf("请输入联系人的姓名\n");scanf("%s", (*address_book)[num].name);printf("请输入联系人性别\n");scanf("%s", (*address_book)[num].sex);printf("请输入联系人年龄\n");scanf("%s", (*address_book)[num].age);printf("请输入联系人电话\n");scanf("%s", (*address_book)[num].phone);printf("请输入联系人住址\n");scanf("%s", (*address_book)[num].address);
}
//[辅助函数]删除联系人信息
void delete_info(pinfo *address_book, char input_name[], int i)
{//如果查找到了,并且不是最后一个人if (i != mumbers - 1){for (; i < mumbers; ++i){strcpy((*address_book)[i].name, (*address_book)[i + 1].name);strcpy((*address_book)[i].sex, (*address_book)[i + 1].sex);strcpy((*address_book)[i].age, (*address_book)[i + 1].age);strcpy((*address_book)[i].phone, (*address_book)[i + 1].phone);strcpy((*address_book)[i].address, (*address_book)[i + 1].address);}--mumbers;printf("该联系人已删除\n");}//如果找到了,并且是最后一人if (i == mumbers - 1){--mumbers;printf("该联系人已删除\n");}
}
//通讯录初始化
void init(pinfo *address_book)
{if (*address_book != NULL){mumbers = 0;}
}
//添加联系人
void add_contact(pinfo *address_book)
{int result = 1;if (mumbers >= size){result = expandCapacity(address_book);}if (result == 1){input_info(address_book, mumbers);++mumbers;printf("成功添加联系人\n");}else{printf("添加联系人失败\n");}
}
//删除指定联系人
void delete_contact(pinfo *address_book)
{printf("请输入要删除的联系人\n");char input_name[20];scanf("%s", &input_name);int result = find_is(address_book, input_name);if (result >= 0){printf("查找到联系人%s您确定要删除吗? y/n\n", input_name);char choise[2];scanf("%s", &choise);if (strcmp(choise, "y") == 0){delete_info(address_book, input_name, result);//如果当前存储的联系人不到容量的1/10就缩小容量到原来的1/4if ((mumbers / size) * 10 < 1){pinfo p = (pinfo)realloc(*address_book, sizeOfStruct * size / 4);if(p != NULL){*address_book = p;size /= 4;}else{printf("reduce capacity failed!\n");}}}if (strcmp(choise, "n") == 0){printf("指令已取消\n");}}else{printf("查无此人!\n");}
}
//查找指定联系人
void find_contact(pinfo *address_book)
{printf("请输入你要查找的联系人\n");char input_name[20];scanf("%s", &input_name);int i = find_is(address_book, input_name);if (i >= 0){printf("该联系人信息如下:\n");view_someone(address_book, i);}else{printf("查无此人!\n");}
}
//修改指定联系人信息
void modify_contact(pinfo *address_book)
{printf("请输入你要修改的联系人\n");char input_name[20];scanf("%s", &input_name);int i = find_is(address_book, input_name);if (i >= 0){printf("查找到联系人%s您确定要修改吗? y/n\n", input_name);char choise[2];scanf("%s", &choise);if (strcmp(choise, "y") == 0){input_info(address_book, i);printf("成功修改联系人!\n");}if (strcmp(choise, "n") == 0){printf("指令已取消\n");}}else{printf("查无此人!\n");}
}
//显示所有联系人
void viewAll_contact(pinfo *address_book)
{printf("共有%d个联系人,全部显示如下:\n", mumbers);printf("姓名        性别  年龄  电话      住址\n");for (int i = 0; i < mumbers; ++i){printf("%s     %s  %s  %s      %s\n",(*address_book)[i].name, (*address_book)[i].sex, (*address_book)[i].age,(*address_book)[i].phone, (*address_book)[i].address);}
}
//清空所有联系人
void emptyAll_contact(pinfo *address_book)
{printf("您确定要清空所有联系人吗? y/n\n");char choise[2];scanf("%s", &choise);if (strcmp(choise, "y") == 0){mumbers = 0;printf("已清空所有联系人!\n");}if (strcmp(choise, "n") == 0){printf("指令已取消\n");}
}
//按名字排序联系人
void sortAll_contact(pinfo *address_book)
{for (int i = 0; i < mumbers - 1; ++i){for (int j = 0; j < mumbers - i - 1; ++j){if (namecmp((*address_book)[i].name, (*address_book)[i + 1].name) < 0){struct address_info temp;temp = (*address_book)[i];(*address_book)[i] = (*address_book)[i + 1];(*address_book)[i + 1] = temp;}}}printf("排序完成!\n");
}
//保存联系人到文件
void save_contact(pinfo *address_book)
{FILE *fp = fopen("./text.txt", "w");if (fp == NULL){perror("fopen");}for (int i = 0; i < mumbers; ++i){fwrite(&(*address_book)[i], sizeof((*address_book)[0]), 1, fp);}fclose(fp);printf("已保存联系人!\n");
}
//加载联系人
void load_contact(pinfo *address_book)
{FILE *fp = fopen("./text.txt", "r");if (fp == NULL){perror("fopen");}struct address_info buffer = { 0 };//读取联系人之前先进行一次初始化init(address_book);int i = 0;while (fread(&buffer, sizeOfStruct, 1, fp)){(*address_book)[i] = buffer;++i;++mumbers;//联系人数量即将溢出则扩容if (mumbers >= size){expandCapacity(address_book);}}fclose(fp);
}
int menu()
{printf("============================\n");printf("1.添加联系人\n");printf("2.删除联系人\n");printf("3.修改联系人\n");printf("4.查找联系人\n");printf("5.显示所有联系人\n");printf("6.清空所有联系人\n");printf("7.按名字排序\n");printf("8.保存联系人到文件\n");printf("9.加载联系人\n");printf("0.退出\n");printf("请输入您的选择!\n");printf("============================\n");int choise = 0;scanf("%d", &choise);return choise;
}
int main()
{pinfo address_book = (pinfo)malloc(sizeOfStruct);printf("%p\n", address_book);init(&address_book);typedef void(*pfuction)(pinfo*);pfuction table[] = {add_contact,delete_contact,modify_contact,find_contact,viewAll_contact,emptyAll_contact,sortAll_contact,save_contact,load_contact};while (1){int choise = menu();if (choise == 0){printf("Good Bye!\n");free(address_book);break;}if (choise < 0 || choise >(int)(sizeof(table) / sizeof(table[0]))){printf("您的输入有误!\n");continue;}table[choise - 1](&address_book);}system("pause");return 0;
}

C语言实现通讯录(动态版)相关推荐

  1. 静态通讯录+动态版通讯录

    文章目录 前言 一.通讯录基本功能 二.静态版通讯录 三.动态版通讯录 总结 前言 在生活中,我们需要将许多信息归总到一起,便于使用和查询,使用通讯录就是一个便捷的选择. 一.通讯录基本功能 1.对信 ...

  2. C语言小项目——通讯录的存储系统(静态版,动态版,文件版)

    目录 前言 一.总体设计框架 二.三种通讯录的功能阐述 三.静态通讯录 1.结构体设计 2.初始化通讯录 3.增加联系人的信息 4.删除联系人的信息 5.查找指定联系人并打印 6.修改联系人的信息 7 ...

  3. 简陋版C语言仿真通讯录之动态内存开辟版本

    简陋版C语言仿真通讯录 https://blog.csdn.net/csdn_kou/article/details/80287640 简陋版C语言仿真通讯录之动态内存开辟版本 给Contact结构体 ...

  4. C语言小项目 -- 通讯录(静态版+动态版+文件版)

    文章目录 一.总体设计思路 1.设计背景 2.设计框架 3.功能概述 二.通讯录(静态版) 1.结构体设计 2.初始化通讯录 3.添加联系人信息 4.删除联系人信息 5.查找联系人(按姓名) 6.查找 ...

  5. c语言通讯录——动态内存版

    本程程序实现了几个功能 1.增加成员  2.删除成员 3.修改         4.查找 5.排序        6.清空通讯录 程序如下所示 本程序分为三个文件 contact.h #define ...

  6. vs2010c语言通讯录读取,用C语言实现通讯录(二、动态版+文件保存信息)

    之前写的静态版的通讯录,只能存储固定数目大小的联系人信息,现在要升级为动态版的,这样只要容量不够的话只需自动扩容就可以啦!而且之前版本的信息每次退出程序后不会保存,每次需要重新录入,加入文件操作后可以 ...

  7. 【C语言进阶】C语言程序设计:动态通讯录(顺序表实现)

    目录 动态通讯录的实现 一.实验的目的和意义 二.实验内容描述 三.功能描述 四.数据结构 1.三大模块 2.结构设计 3.动态开辟 4.文件操作 5.主要函数 五.流程图及模块算法 1.Contac ...

  8. 个人通讯管理程序C语言,个人通讯录管理系统C语言源程序(优秀版)[1]

    个人通讯录管理系统C语言源程序(优秀版)[1] 更新时间:2017/2/22 1:03:00  浏览量:613  手机版 C语言个人通讯录系统源程序: #include /*头文件*/ #includ ...

  9. vbs画动态爱心代码_用C语言实现心形表白程序[酷炫动态版]

    前几天给大家放一个C语言实现心形表白功能的程序,许多小白觉得有意思,今天给大家再放一个更炫酷的表白程序,有需要的童鞋拿去吧~ 先看看效果图吧: 因为是动图,所以只能象征性给大家截图啦~ 怎么样?童鞋们 ...

  10. 从0开始学c语言 - 34 - 通讯录 -静态、动态、存到文件(三种版本)

    上一篇:从0开始学c语言-33-动态内存管理_阿秋的阿秋不是阿秋的博客-CSDN博客 我发现,理论的学习文章没几个人看,如果是这种实践类型的文章,看的人很多,偏偏我之前都是扔完代码就走了,也没认真写这 ...

最新文章

  1. python在中小学教学中的应用-Python编程已经走进中小学课堂
  2. java计算圆锥体积_六年级:美妙数学之“球的体积计算”(0430六)
  3. server的自增主键返回函数 sql_SQL自增主键函数
  4. 字符缓冲输入流,高效读取整行数据
  5. 集群,分布式,微服务的区别
  6. 05-类--+-号使用
  7. 记一道简单的Java面试题,但答错率很高!
  8. 猫工智能:卷积神经网络层的实现
  9. 细说表单提交的GET和POST
  10. Java集合源码剖析
  11. 如何手动配置IP地址
  12. Hadoop上路-03_Hadoop JavaAPI
  13. vite Unrestricted file system access to
  14. 【实用的微缩版 初级开发面试题】
  15. 音箱箱体的分类(四)
  16. 最全的WiFi速率对应表(802.11b、802.11g、802.11a、802.11n、802.11ac、802.11ax)及速率计算方法
  17. 将Windows驱动程序从一台计算机复制到另一台计算机
  18. idea 推送代码报‘error: The following untracked working tree ……’
  19. jsp报错500解决办法
  20. 现代无线侦察技术(二):MANA 和已知信标攻击

热门文章

  1. Java基础题26:(多选题)下列哪些选项属于Java技术体系()
  2. gc overhead limit exceeded解决方案
  3. 小布老师oracle,小布老师-oracle-1
  4. 视频教程-计算机二级(VB)-计算机等级考试
  5. 调研报告与调查报告的区别及写作技巧
  6. 计算机用户全部删除,电脑用户怎么删除:批量删除计算机用户方法
  7. Python 面向对象版学员管理系统
  8. 【微信机器人】实现保存微信表情包到相册
  9. 全国软考——软件评测师有感
  10. 《软件测试》第九章 兼容性测试