实现一个通讯录:

通讯录可以用来存储个人信息,当通讯录空间已满时,可以自动扩充通讯录的存储空间,每个人的信息包括:姓名、性别、年龄、电话、住址。

提供方法:

1.添加联系人信息;

2.删除指定联系人信息;

3.查找指定联系人信息;

4.修改指定联系人信息;

5.显示所有联系人信息;

6.清空所有联系人;

7.以名字排序所有联系人。

根据上述需求,我们依次定义出所需要的结构体、自定义函数等等。

个人信息结构体定义:

#define MAX_NAME_SIZE 20
#define MAX_SEX_SIZE  3
#define MAX_TEL_SIZE  12
#define MAX_ADDR_SIZE 256typedef struct PersonInfo
{char name[MAX_NAME_SIZE];char sex[MAX_SEX_SIZE];int age;char tel[MAX_TEL_SIZE];char address[MAX_ADDR_SIZE];
}PersonInfo;

在定义了个人信息结构体后,还需要定义出通讯录结构体,按照满足题目要求 “当通讯录空间已满时,可以自动扩充通讯录的存储空间”,通讯录结构体定义如下:

typedef struct Contact
{PersonInfo* pCont;size_t capacity;//通讯录的最大容量size_t size;
};

根据题目要求,初步定义出以下函数接口:

void InitContact(Contact* pcnt);//初始化通讯录
void AddContact(Contact* pcnt);//添加联系人信息
void DelContact(Contact* pcnt);//删除指定联系人信息
void FindContact(Contact* pcnt);//查找指定联系人信息
void ModifyContact(Contact* pcnt);//修改指定联系人信息
void ShowContact(Contact* pcnt);//显示所有联系人信息
void ClearContact(Contact* pcnt);//清除所有联系人
void SortContact(Contact* pcnt);//以名字排序所有联系人

根据题目要求,利用顺序表的相关知识实现通讯录管理系统,代码如下:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include<string.h>
#include<stdbool.h>#define MAX_NAME_SIZE 20
#define MAX_SEX_SIZE  3
#define MAX_TEL_SIZE  12
#define MAX_ADDR_SIZE 256#define DEFAULT_CONTACT_SIZE 128//通讯录默认空间大小
#define CONTACT_INC_SIZE 20//通讯录空间每次扩容大小enum { QUIT, ADD, DEL, FIND, MODIFY, SHOW, CLEAR, SORT };typedef struct PersonInfo
{char name[MAX_NAME_SIZE];char sex[MAX_SEX_SIZE];int age;char tel[MAX_TEL_SIZE];char address[MAX_ADDR_SIZE];
}PersonInfo;typedef struct Contact
{PersonInfo* pCont;size_t capacity;size_t size;
}Contact;//函数声明
void InitContact(Contact* pcnt);//初始化通讯录
void AddContact(Contact* pcnt);//添加联系人信息
void DelContact(Contact* pcnt);//删除指定联系人信息
void FindContact(Contact* pcnt);//查找指定联系人信息
void ModifyContact(Contact* pcnt);//修改指定联系人信息
void ShowContact(Contact* pcnt);//显示所有联系人信息
void ClearContact(Contact* pcnt);//清除所有联系人
void SortContact(Contact* pcnt);//以名字排序所有联系人
void DestroyContact(Contact* pcnt);//程序结束时摧毁通讯录,防止内存泄漏
int FindByName(Contact* pcnt, char Name[]);
bool CheckCapacity(Contact* pcnt);
bool IsEmpty(Contact* pcnt);int main(int argc, char* argv[])
{//初始化通讯录Contact cont;InitContact(&cont);int select = 1;while (select){printf("**************通 讯 录*****************\n");printf("* [1] Add            [2] Del          *\n");printf("* [3] Find           [4] Modify       *\n");printf("* [5] Show           [6] Clear        *\n");printf("* [7] Sort           [0] Quit System  *\n");printf("***************************************\n");printf("请选择:>");scanf("%d", &select);if (select == QUIT)break;switch (select){case ADD:AddContact(&cont);break;case DEL:DelContact(&cont);break;case FIND:FindContact(&cont);break;case MODIFY:ModifyContact(&cont);break;case SHOW:ShowContact(&cont);break;case CLEAR:ClearContact(&cont);break;case SORT:SortContact(&cont);break;}}printf("GoodBye,退出通讯录系统...\n");DestroyContact(&cont);return 0;
}
void InitContact(Contact* pcnt)
{pcnt->pCont = (PersonInfo*)malloc(sizeof(PersonInfo) * DEFAULT_CONTACT_SIZE);memset(pcnt->pCont, 0, sizeof(PersonInfo) * DEFAULT_CONTACT_SIZE);//将开辟的空间全部初始化为0pcnt->capacity = DEFAULT_CONTACT_SIZE;pcnt->size = 0;
}
bool CheckCapacity(Contact* pcnt)
{if (pcnt->size >= pcnt->capacity){//扩容PersonInfo* new_cont = (PersonInfo*)realloc(pcnt->pCont,sizeof(PersonInfo) * (pcnt->capacity + CONTACT_INC_SIZE));if (pcnt->pCont == NULL)return false;pcnt->pCont = new_cont;pcnt->capacity += CONTACT_INC_SIZE;printf("扩容成功.\n");}return true;
}
bool IsEmpty(Contact* pcnt)
{return pcnt->size == 0;
}
void AddContact(Contact* pcnt)
{if (!CheckCapacity(pcnt)){printf("通讯录已满,不能增加联系人信息...\n");return;}printf("姓名:>");scanf("%s", pcnt->pCont[pcnt->size].name);printf("性别:>");scanf("%s", pcnt->pCont[pcnt->size].sex);printf("年龄:>");scanf("%d", &pcnt->pCont[pcnt->size].age);printf("电话:>");scanf("%s", pcnt->pCont[pcnt->size].tel);printf("住址:>");scanf("%s", pcnt->pCont[pcnt->size].address);pcnt->size++;printf("增添联系人信息成功...\n");
}
void DelContact(Contact* pcnt)
{printf("请输入要删除的联系人姓名:>");char Name[MAX_NAME_SIZE];scanf("%s", Name);int index = FindByName(pcnt, Name);if (index = -1){printf("要删除的联系人不存在...\n");return;}for (int i = index; i < pcnt->size; i++){pcnt->pCont[i] = pcnt->pCont[i + 1];}pcnt->size--;printf("删除信息成功...\n");
}
void FindContact(Contact* pcnt)
{if (IsEmpty(pcnt)){printf("通讯录为空,不能查找...\n");return;}char Name[MAX_NAME_SIZE];scanf("%s", Name);int index = FindByName(pcnt, Name);if (index = -1){printf("要查找的联系人不存在...\n");return;}printf("%-8s%-6s%-6d%-13s%s\n", pcnt->pCont[index].name,pcnt->pCont[index].sex,pcnt->pCont[index].age,pcnt->pCont[index].tel,pcnt->pCont[index].address);
}
void ModifyContact(Contact* pcnt)
{if (IsEmpty(pcnt)){printf("通讯录为空,不能修改...\n");return;}char Name[MAX_NAME_SIZE];scanf("%s", Name);int index = FindByName(pcnt, Name);if (index = -1){printf("要修改的联系人不存在...\n");return;}printf("%s", "你想修改什么信息(1-姓名 2-性别 3-年龄 4-电话 5-住址)");int select;scanf("%d", &select);switch (select){case 1:printf("请输入要修改的姓名:>");scanf("%s", pcnt->pCont[index].name);break;case 2:printf("请输入要修改的性别:>");scanf("%s", pcnt->pCont[index].sex);break;case 3:printf("请输入要修改的年龄:>");scanf("%d", &pcnt->pCont[index].age);break;case 4:printf("请输入要修改的电话:>");scanf("%s", pcnt->pCont[index].tel);break;case 5:printf("请输入要修改的住址:>");scanf("%s", pcnt->pCont[index].address);break;}printf("修改信息成功...\n");
}
void ShowContact(Contact* pcnt)
{printf("%-8s%-6s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "地址");for (int i = 0; i < pcnt->size; ++i){printf("%-8s%-6s%-6d%-13s%s\n", pcnt->pCont[i].name,pcnt->pCont[i].sex,pcnt->pCont[i].age,pcnt->pCont[i].tel,pcnt->pCont[i].address);}
}
void ClearContact(Contact* pcnt)
{printf("是否确定清除通讯录<Y/N>:>");fflush(stdin); //清除上一次的\nchar ch = getchar();if (ch == 'N' || ch == 'n'){printf("清除通讯录取消....\n");return;}else if (ch == 'Y' || ch == 'y'){pcnt->size = 0;printf("清除通讯录成功....\n");return;}printf("输入错误.....\n");
}
void SortContact(Contact* pcnt)
{for (int i = 0; i < pcnt->size - 1; ++i){for (int j = 0; j < pcnt->size - i - 1; ++j){if (strcmp(pcnt->pCont[j].name, pcnt->pCont[j + 1].name) > 0){PersonInfo tmp = pcnt->pCont[j];pcnt->pCont[j] = pcnt->pCont[j + 1];pcnt->pCont[j + 1] = tmp;}}}printf("排序成功.\n");
}
void DestroyContact(Contact* pcnt)
{free(pcnt->pCont);pcnt->pCont = NULL;pcnt->capacity = pcnt->size = 0;
}
int FindByName(Contact* pcnt, char Name[])
{for (int i = 0; i < pcnt->size; i++){if (strcmp(pcnt->pCont[i].name, Name) == 0)return i;}return -1;
}

部分调试界面: 

C语言实现通讯录管理系统(简易版)相关推荐

  1. c语言实现学生二科成绩的单链表,c++链表实现学生成绩管理系统(简易版)

    #include using namespace std; typedef struct student{ int id;//学号 string sex; string name; int cpp;/ ...

  2. 通讯录管理系统—优化版 (C语言 期末大作业 课程设计)

    文章目录 通讯录管理系统 --- 优化版 一.设计要求 二.总体设计 1.系统具体功能 2.数据结构设计 3.函数功能 4.磁盘文件 三.详细设计 主界面 管理员模块 用户模块 四.程序测试 1.查看 ...

  3. 【JavaEE】图书管理系统-简易版

    文章目录 book包 Book类 BookList类 operation包 AddOperation 类 BorrowOperation 类 DelOperation类 DisplayOperatio ...

  4. php通讯录系统,EML企业通讯录管理系统 php版 v5.4

    企业通讯录管理系统,向企业员工随时随地的提供企业通讯录信息,用户可在手机端实时查看人员联系方式,拨打电话等全面提高了企业内部沟通效率. 主要功能有:用户管理(添加用户,删除用户用户,更新用户资料):通 ...

  5. c语言个人通讯录管理系统实验报告_C语言个人通讯录管理系统课程设计报告

    语言程序设计> C <课程设计报告 _________:__________C 设计题目语言个人通讯录管理系统 摘要 本次课程设计地题目为个人通讯录管理系统, 要求将程序中所输入地联系人姓 ...

  6. eml企业通讯录管理系统经典版V5.4.5

    企业通讯录管理系统,向企业员工随时随地的提供企业通讯录信息,用户可在手机端实时查看人员联系方式,拨打电话等全面提高了企业内部沟通效率. 主要功能有:用户管理(添加用户,删除用户用户,更新用户资料):通 ...

  7. C语言家族通讯录管理系统

    C语言家族通讯录管理系统 1.家族通讯录管理系统 1.1 题目简述 家谱能以一种表谱形式记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹,它是中国特有的文化遗产之一;不管行多远,飞多高,家是你永远 ...

  8. C语言编程网站用户管理系统,C语言系统用户管理系统Word版

    <C语言系统用户管理系统Word版>由会员分享,可在线阅读,更多相关<C语言系统用户管理系统Word版(13页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版文档 ,希 ...

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

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

最新文章

  1. Mythic推出“万能”芯片,任何设备都能一秒变身智能产品
  2. 《OpenCV 4开发详解》图像的读取与显示
  3. 墨客原型系统——随笔分享APP
  4. 如何在 Ubuntu 14.04 和 12.04 上测试 systemd
  5. 基础算法 —— 递推算法
  6. elasticsearch x-pack license过期
  7. 解决linux删除文件后空间没有释放问题
  8. Program Variant Scheduling job
  9. Python核心编程2第三章课后练习
  10. 155.最小栈(力扣leetcode) 博主可答疑该问题
  11. php 同义词词库,php如何实现同义词替换
  12. 域名系统(Domain Name System,DNS)
  13. IE11兼容ES6语法问题
  14. 七、ref引用与数组的常用方法
  15. 高防服务器高防ip高防cdn和现在的云防护用哪种好呢
  16. 在SVN服务器彻底删除文件
  17. 城市公交站点及换乘方案设计
  18. 网络流量分析 NetFlow是什么 详解 科普 ~互联网业务流量监测技术的应用和设计---perfect
  19. linux全角半角切换,教您输入法全角和半角怎么切换
  20. attachment和inline的区别

热门文章

  1. swing 按钮字体字体_装饰字体
  2. java毕业生设计中小型酒店客房预订系统计算机源码+系统+mysql+调试部署+lw
  3. JCG Studios – ArkDroid Beta发布
  4. C++大数加法-----OvO
  5. Django网页模板的继承include与复用extends
  6. 每天上班通勤四个小时,太累了!
  7. 经营管理者杂志经营管理者杂志社经营管理者编辑部2023年第2期目录
  8. 定性数据分布分析(饼图,条形图)
  9. Clear Type之父谈阅读革命(三,终结篇)
  10. Oracle简单查询练习题(附数据库及答案)