简陋版C语言仿真通讯录

https://blog.csdn.net/csdn_kou/article/details/80287640

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

给Contact结构体增加一个容量,来表示什么时候增容


#define MAX_NAME 20
typedef struct PeoInfo
{char name[MAX_NAME];int age;char sex[4];
}people;typedef struct Contact
{people * data;int count;int capacity;
}Contact, *pContact;

初始化容量大小,这里我们做小一点可以看到增容效果

/*初始化*/
void InitContact(pContact pc)
{pc->count = 0;pc->capacity = DEFAULT_SZ;pc->data = (people*)calloc(sizeof(people), pc->capacity);
}

检查是否需要增容放在了增加数据的第一句作为判断

/*增加数据*/
void check_cap(pContact pc)
{if (pc->count == pc->capacity){people* p = (people *) realloc(pc->data,(pc->capacity+2)*sizeof(people));if (p != NULL){pc->data = p;p = NULL;}pc->capacity += 2;printf("增容成功");}
}

最后别忘了,动态内存开辟空间要释放

void Free(pContact pc)
{free(pc->data);pc->capacity = 0;pc->count = 0;pc->data = NULL;printf("释放空间成功\n");
}

完整代码

main.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "contact.h"int main()
{int input = 0;Contact my_con;InitContact(&my_con);do {menu();printf("please chose");scanf("%d", &input);//运行第二遍是输入字母默认为1switch (input){case ADD:AddContact(&my_con);justice(&my_con);break;case SHOW:ShowContact(&my_con);break;case DEL:DelContact(&my_con);break;case EXIT:Free(&my_con);break;case SEARCH:Search(&my_con);break;case SORT:Sort(&my_con);break;default:fflush(stdin);fflush(stdout);//sync();//清除缓冲区//clear();//清除错误状态break;}} while (input);system("pause");return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "contact.h"void menu()
{printf("*************************\n");printf("**1.add     2.show*******\n");printf("**3.search  4.delete*****\n");printf("**5.sort    0.exit*******\n");printf("*************************\n");
}/*初始化*/
void InitContact(pContact pc)
{pc->count = 0;pc->capacity = DEFAULT_SZ;pc->data = (people*)calloc(sizeof(people), pc->capacity);
}/*增加数据*/
void check_cap(pContact pc)
{if (pc->count == pc->capacity){people* p = (people *) realloc(pc->data,(pc->capacity+2)*sizeof(people));if (p != NULL){pc->data = p;p = NULL;}pc->capacity += 2;printf("增容成功");}
}void AddContact(pContact pc)
{check_cap(pc);if (pc->count < 1000){printf("请输入名字>");scanf("%s", pc->data[pc->count].name);printf("请输入年龄>");scanf("%d", &pc->data[pc->count].age);printf("请输入性别>");scanf("%s", pc->data[pc->count].sex);pc->count++;}else{printf("存不下了");return;}
}/*展示*/
void ShowContact(pContact pc)
{printf("%-11s %-11s  %-11s \n","姓名","年龄","性别");if (pc->count != 0){for (int i = 0; i < pc->count; i++){if (pc->data[i].age != 0){printf("%d|%-11s %-11d  %-11s \n", i,pc->data[i].name,pc->data[i].age,pc->data[i].sex);}}}else{printf("通讯没有号码\n");return;}
}/*删除*/
void DelContact(pContact pc)
{printf("请输入要删除的编号");int i = 0, num;scanf("%d", &num);for (i = num; i < pc->count; i++){pc->data[i] = pc->data[i + 1];}pc->count - 1;
}/*判断输入的名字是不是重复,如果重复就删除*/
void justice(pContact pc)
{for (int i = 0; i < pc->count - 1; i++){if (!strcmp(pc->data[pc->count - 1].name, pc->data[i].name)){printf("\n非法输入\n");pc->data[pc->count - 1] = pc->data[pc->count];}}
}/*比较*/
char compare(const void * a, const void * b)
{return (*(char*)a  - *(char*)b);
}void Sort(pContact pc)
{int i;qsort(pc->data, pc->count, sizeof(people), compare);for (i = 0; i<pc->count; i++)printf("%d|%-11s %-11d  %-11s \n", i, pc->data[i].name, pc->data[i].age, pc->data[i].sex);return;
}/*查找*/
int search_son(pContact pc, char *name)
{int i, j;for (i = 0; i < pc->count; i++){if (!strcmp(name, pc->data[i].name)){return i;}}return -1;
}void Search(pContact pc)
{int i = 0;char name[20];//要给一个大小,要不然一直读取位置时发生访问冲突printf("name>");scanf("%s", &name);i = search_son(pc, name);if (i >= 0){printf("找到了,呜啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦!\n");printf("%d|%-8s%8d%11s\n", i, pc->data[i].name, pc->data[i].age, pc->data[i].sex);printf("******************************************\n");}else{printf("Can't find it\n");}return;
}void Free(pContact pc)
{free(pc->data);pc->capacity = 0;pc->count = 0;pc->data = NULL;printf("释放空间成功\n");
}

contact.h

#ifndef __CONTACT_H__
#define __CONTACT_H__#define DEFAULT_SZ 3
/*
这个顺序就是switch()的顺序,注意逗号不是分号,最后一个不写符号
*/
enum OPTION
{EXIT,ADD,SHOW,SEARCH,DEL,SORT
};#define MAX_NAME 20
typedef struct PeoInfo
{char name[MAX_NAME];int age;char sex[4];
}people;typedef struct Contact
{people * data;int count;int capacity;
}Contact, *pContact;void AddContact(pContact pc);
void InitContact(pContact pc);
void ShowContact(pContact pc);
void DelContact(pContact pc);
void justice(pContact pc);
void Search(pContact pc);
void Sort(pContact pc);
void Free(pContact pc);
#endif // !__CONTACT_H__

简陋版C语言仿真通讯录之动态内存开辟版本相关推荐

  1. 简陋版C语言仿真通讯录

    文件cotact.c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #inclu ...

  2. C/C++动态内存开辟详解(含常见错误以及经典面试题)

    动态内存开辟 1.四个重要的内存函数 1.1 malloc和free 1.2 calloc 1.3 realloc 2.常见错误 2.1 对NULL指针进行解引用操作 2.2 对动态开辟内存的越界访问 ...

  3. C语言实现通讯录【二】(动态内存开辟,文件数据存储)

    C语言实现通讯录[二] 在C语言实现通讯录[一]的基础上进行优化,主要实现两大模块: 动态内存开辟 文件数据存储 动态内存开辟: 考虑到通讯录的大小无法固定,在C语言实现通讯录[一]版本上定义一个足够 ...

  4. 【c语言】通讯录【动态完整版有排序和文件操作】

    一.通讯录是什么 二.通讯录的实现 一.通讯录是什么 通讯录 1.我假设这个通讯录能够存放每个学生的信息 每个人信息:名字+年龄+性别+电话+地址 我的目的是创建通讯录.实现对应功能,为了数据持久化放 ...

  5. 【C语言】动态内存开辟

    目录 一.动态内存开辟的原因 二.动态内存开辟函数 1.malloc函数 2.free函数 3.calloc 4.realloc 总结 三.C/C++内存开辟 四.柔性数组 1.柔性数组定义 2.柔性 ...

  6. C语言提高篇之——动态内存管理

    目录 1. 动态内存分配存在的意义 2.动态内存函数介绍 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 3.常见的动态内存错误 3.1 对空指针解引用 3.2 ...

  7. C语言之动态内存开辟之malloc

    说到动态内存开辟,就不得不谈malloc.calloc.realloc以及free,所以接下来分别谈一下这四个函数. 1.malloc(开辟动态内存空间) 头文件:#include<stdlib ...

  8. C语言动态内存开辟详解(malloc,calloc,realloc,free,柔型数组)

    目录 一.概述 二.相关库函数的使用 1.malloc 2.calloc malloc vs. calloc 异同 3.free的使用 4.realloc 三.易错点 四.C\C++程序的内存开辟规则 ...

  9. 通讯录2.0(动态内存增长版本)

    通讯录2.0 我们在写之前通讯录1.0版本时,通讯录只能存储1000人的信息,若想存储更多人的信息就必须手动修改定义的数值,不够方便.通讯录2.0版本实现了内存的自动增长,若想存储更多人的信息,可以自 ...

最新文章

  1. boost::function_types::is_callable_builtin用法的测试程序
  2. 运维从业人员是否需要考证?
  3. 单片机c语言必背代码_最适合单片机编程的高级语言,除了C语言,别无选择!...
  4. 05.Qt设置背景图片
  5. Ubuntu编译内核及grub的一些笔记
  6. easyui弹出加载遮罩层(转)
  7. humid vs wet vs moist
  8. keras 基础入门整理
  9. java如何将字符串转化为日期_java如何将字符串转为日期
  10. 《TCP/IP详解 卷1:协议》学习笔记(未完待续)
  11. 西南石油大学计科院主页
  12. cuda安装linux命令,ubuntu下安装cuda的两种方法
  13. Linux 操作系统的 ECS 挂载云硬盘
  14. linux三剑客面试题,Linux三剑客之sed
  15. mh采样算法推导_科学网—MCMC中的Metropolis Hastings抽样法 - 张金龙的博文
  16. HCE知识盘点:大事记、NFC卡模拟、与SE兼容
  17. Android12 WMS启动流程
  18. 什么是加密?有哪些加密类型和加密算法?
  19. 陈奕迅《歌神HQCD》[WAV分轨]
  20. 什么是红股什么是转增股

热门文章

  1. Netty中的策略者模式
  2. git提交代码时报错:nothing added to commit but untracked files present
  3. Linux 常用命令二 pwd cd
  4. 设计模式学习(三)——装饰器模式
  5. C++:cin.getline
  6. linux 广播命令,Linux基础命令---ping
  7. Drawwhile计算机软件,计算机程序设计、小女纸又怒编一程序、求鉴定、
  8. linux 文件的目录,Linux文件及目录管理
  9. halcon 图像差分_Halcon编程-基于纹理的mara检测
  10. python中变量名后的逗号_深入浅析python变量加逗号,的含义