通讯录(其中有malloc和realloc的使用)

//简易通讯录制作
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<assert.h>
#define MAX 100//通讯录的联系人个数
#define MAX_NAME 20//规定人名字符串长度
#define MAX_SEX 5//规定性别字符串长度
#define MAX_TELE 12//规定电话字符串长度
#define MAX_ADDR 30//规定住址字符串长度
#define DETFALT_SZ 3//动态容量默认大小
#define INC_SZ 2//增加的内存大小struct peoinfo {//联系人信息结构体char name[MAX_NAME];//姓名char sex[MAX_SEX];//性别char tele[MAX_TELE];//电话int age;//年龄char addr[MAX_ADDR];//家庭住址
};
//struct contact {//通讯录结构体(静态版本)
//  struct peoinfo data[MAX];
//  int sz;
//};
//
struct contact {//通讯录结构体(动态版本)struct peoinfo* data;int sz;int capacity;//容量大小};
//函数声明
void menu();//菜单
void initcontact(struct contact* pc);//初始化通讯录结构体
void addcontact(struct contact* pc);//1.添加联系人
void delcontact(struct contact* pc);//2.删除联系人
void updatecontact(struct contact* pc);//3.修改联系人信息
void qsortcontact(struct contact* pc);//4.对联系人信息排序
void showcontact(struct contact* pc);//5.查看通讯录
void searchcontact(struct contact* pc);//6.寻找指定联系人
void delallcontact(struct contact* pc);//7.清空所有联系人
int check_capacity(struct contact* pc);//检查是否能够或者需要增容
void destroycontact(struct contact* pc);//销毁开辟的内存void menu()
{printf("*********************************************************\n");printf("*********************《简易通讯录》**********************\n");printf("**********1.添加联系人      2.删除联系人     ************\n");printf("**********3.修改联系人信息  4.排序           ************\n");printf("**********5.查看通讯录      6.寻找指定联系人 ************\n");printf("**********7.清空所有联系人  0.退出  ************************\n");printf("*********************************************************\n");
}
//void initcontact(struct contact* pc)//初始化通讯录结构体(静态版本)
//{
//  pc->sz = 0;
//  memset(pc->data, 0, MAX * sizeof(struct peoinfo));
//}//void addcontact(struct contact* pc)//1.添加联系人(静态版本)
//{
//  if (pc->sz == MAX)
//  {
//      printf("通讯录已满\n");
//      return;
//  }
//  printf("请输入你要添加联系人的姓名->\n");
//  scanf("%s", pc->data[pc->sz].name);
//  printf("请输入你要添加联系人的性别->\n");
//  scanf("%s", pc->data[pc->sz].sex);
//  printf("请输入你要添加联系人的年龄->\n");
//  scanf("%d", &pc->data[pc->sz].age);
//  printf("请输入你要添加联系人的电话:\n");
//  scanf("%s", pc->data[pc->sz].tele);
//  printf("请输入你要添加联系人的家庭住址:\n");
//  scanf("%s", pc->data[pc->sz].addr);
//  pc->sz++;
//  printf("新的联系人添加成功!\n");
//}void initcontact(struct contact* pc)//初始化通讯录结构体(动态版本)
{assert(pc);pc->data= (struct peoinfo*)malloc(DETFALT_SZ * sizeof(struct peoinfo));if (pc->data == NULL){perror("initcontact()");return; }pc->sz = 0;pc->capacity = DETFALT_SZ;
}void destroycontact(struct contact* pc)//销毁开辟的内存
{free(pc->data);pc->data = NULL;pc->capacity = 0;pc->sz = 0;
}int check_capacity(struct contact* pc)
{if (pc->sz == pc->capacity){struct peoinfo* p = (struct peoinfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(struct peoinfo));if (p != NULL){pc->data = p;pc->capacity += INC_SZ;printf("增容成功\n");return 1;}else{perror("addcontact()");return 0;}}elsereturn 1;
}
void addcontact(struct contact* pc)//1.添加联系人(动态版本)
{assert(pc);if (0 == check_capacity(pc)){return;}printf("请输入你要添加联系人的姓名->\n");scanf("%s", pc->data[pc->sz].name);printf("请输入你要添加联系人的性别->\n");scanf("%s", pc->data[pc->sz].sex);printf("请输入你要添加联系人的年龄->\n");scanf("%d", &pc->data[pc->sz].age);printf("请输入你要添加联系人的电话:\n");scanf("%s", pc->data[pc->sz].tele);printf("请输入你要添加联系人的家庭住址:\n");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("新的联系人添加成功!\n");
}int findname(struct contact* pc, char name[])//寻找与结构体中名字相同的下标
{for (int i = 0; i < pc->sz; i++){if(strcmp(pc->data[i].name,name)==0){return i;}}return -1;
}
void delcontact(struct contact* pc)//2.删除联系人
{printf("请输入你要删除的联系人->\n");char name[MAX_NAME];scanf("%s", name);if (findname(pc, name) == -1){printf("你输入的联系人不存在\n");}else{for (int i = findname(pc, name); i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("联系人删除成功!\n");}
}void updatecontact(struct contact* pc)//3.修改联系人信息
{printf("请输入你要修改的联系人->\n");char name[MAX_NAME];scanf("%s", name);int ret = findname(pc, name);if (findname(pc, name) == -1){printf("你输入的联系人不存在\n");}else{printf("请输入修改后的联系人的姓名->\n");scanf("%s", pc->data[ret].name);printf("请输入修改后的联系人的性别->\n");scanf("%s", pc->data[ret].sex);printf("请输入修改后的联系人的年龄->\n");scanf("%d", &pc->data[ret].age);printf("请输入修改后的联系人的电话:\n");scanf("%s", pc->data[ret].tele);printf("请输入修改后的联系人的家庭住址:\n");scanf("%s", pc->data[ret].addr);printf("联系人信息修改成功!\n");}
}void byageqsort(const char* e1, const char* e2)//通过年龄排序
{return ((struct peoinfo*)e1)->age - ((struct peoinfo*)e2)->age;
}void bynamesort(const char* e1, const char* e2)//通过名字字典序排序
{return strcmp(((struct peoinfo*)e1)->name, ((struct peoinfo*)e2)->name);
}void qsortcontact(struct contact* pc)//4.对联系人信息排序
{qsort(pc->data, pc->sz, sizeof(struct peoinfo), byageqsort);
}void showcontact(struct contact* pc)//5.查看通讯录
{if (pc->sz == 0){printf("通讯录中的内容为空!请先输入联系人!\n");return;}printf("%-10s %-8s %-8s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "家庭住址");for (int i = 0; i < pc->sz; i++){printf("%-10s %-8s %-8d %-15s %-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);}
}void searchcontact(struct contact* pc)//6.寻找指定联系人
{printf("请输入你要查找的联系人->\n");char name[MAX_NAME];scanf("%s", name);int ret = findname(pc, name);if (ret == -1){printf("你输入的联系人不存在\n");}else{printf("你要查找的联系人信息如下:\n");printf("%-10s %-8s %-8s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "家庭住址");printf("%-10s %-8s %-8d %-15s %-20s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].tele, pc->data[ret].addr);}
}void delallcontact(struct contact* pc)//7.清空所有联系人
{pc->sz = 0;memset(pc->data, 0, MAX * sizeof(struct peoinfo));printf("已清空所有联系人!\n");
}int main()
{struct contact con;initcontact(&con);int input=-1;do {menu();printf("请输入你的选择->\n");scanf("%d", &input);switch (input){case 1:addcontact(&con); break;case 2:delcontact(&con); break;case 3:updatecontact(&con); break;case 4:qsortcontact(&con); break;case 5:showcontact(&con); break;case 6:searchcontact(&con); break;case 7:delallcontact(&con); break;case 0:destroycontact(&con);  printf("成功退出通讯录\n"); break;default:printf("你输入的数字有误\n");  break;}} while (input);
}

动态版简易通讯录制作相关推荐

  1. Android Studio 简易通讯录制作 (Java)

    通讯录首页: 添加联系人页面: 修改联系人: 删除联系人: 程序代码: MainActivity.java package com.example.myapplication;import andro ...

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

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

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

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

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

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

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

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

  6. 制作网页版简易计算器(Calculator)

    网页版计算器的制作比想象中要来的容易,界面上只需固定计算器面板的宽高和按钮的宽高即可. 先放张图: 代码下载与演示:https://codepen.io/yinyoupoet/pen/oeewWw 讲 ...

  7. 在Linux下开发简易通讯录

    通过这一段时间的学习,这两天花了不少时间巩固理解,终于完成了在Linux下开发简易通讯录,由于时间仓促,该程序有着不少bug,对于用户的输入容错率也不高,只做了开始菜单的输入容错,功能也只实现了基本的 ...

  8. 怎么用HTML5制作万花筒,简易万花筒制作详细步骤 手工万花筒的做法图解

    可以说是简陋的万花筒,却曾经是所有孩子们最爱的玩具.在物资匮乏的年代,一只万花筒足以迷住一个孩子好奇的心! 前面刚刚跟小伙伴们分享了一款万花筒的制作方法,虽然卖相和质量都很好,但是材料准备和制作步骤都 ...

  9. c语言通讯录打电话,C语言实现简易通讯录 | 术与道的分享

    #include #include #include #include #include #pragma warning (disable:4996) enum Contact //枚举变量 { Qu ...

  10. C++实现简易通讯录

    功能和效果图 功能 通讯录实现联系人查找,添加联系人,删除联系人,联系人信息修改 效果图 实现代码 创建结构体 typedef struct News {string name; //姓名string ...

最新文章

  1. linux内核功能有,好消息!LINUX内核2.6.18终于支持实时功能了
  2. 计算机专业中专排名,成都计算机中专学校排名
  3. Leet Code OJ 20. Valid Parentheses [Difficulty: Easy]
  4. Linux应用服务导致系统负载过高问题排查
  5. miui 8.2 android版本下载,miui8系统
  6. CVE-2014-4877 wget: FTP Symlink Arbitrary Filesystem Access
  7. 使用MAC 编译合约的时候报错:
  8. rose软件下载(Rational Rose 2003 Enterprise Edition)
  9. 【转载】蜗牛星际矿渣黑群晖安装折腾路以及指引
  10. 如何实现一个以中国为中心的世界地图
  11. vnc远程控制软件怎么用,vnc远程控制软件到底该怎么用,使用教程
  12. 笑话理解之Mature
  13. Eclipse:解决Eclipse看不了java的源码
  14. (二)对导入的Excel某列进行合并、求和,删除重复行
  15. Agv、Rgv 车辆控制调度系统开发知识点篇
  16. OLT(光线路终端)介绍
  17. HBuilder制作英雄皮肤抽奖小游戏
  18. 云平台 造就智能家居
  19. 计算机丢失quili.dll怎么处理,科技知识:台电p76平板电脑刷机教程
  20. 机器学习之K近邻算法原理+应用实例

热门文章

  1. 数据库表的创建与查询
  2. Tomcat JAAS 身份验证和授权
  3. idea常用快捷键以及自定义快捷键
  4. 分享按键精灵中使用大漠插件做后台脚本
  5. java 生成uuid
  6. 关于使用npm下载资源包的一些常用命令
  7. npm下载axios
  8. 支付安全不能说的那些事
  9. scrapy 爬虫之爬取CSDN博客(一)
  10. android手机怎么root,安卓手机如何Root 安卓手机Root权限获取图为教程