contact.h
#pragma once
#include
#include
#include
#include
//信息容量
#define MAX 1000
//名字
#define NAME_MAX 20
//性别
#define SEX_MAX 5
//电话
#define TELE_MAX 12
//地址
#define ADDR_MAX 30
//初始化前能够存放的数据空间个数
#define DEEAULT_MAX 3
//每次开辟增加n个数据空间个数
#define SZ_MAX 2
typedef struct Peoinfo
{
char name[NAME_MAX];//姓名
char sex[SEX_MAX];//性别
int age;//年龄
char tele[TELE_MAX];//电话
char addr[ADDR_MAX];//地址
}Peoinfo;
//静态版
//typedef struct contact
//{
// //创建一个大小为peoinfo结构体类型的数组
// peoinfo data[MAX];
// 记录当前通讯录中有效信息的个数
// int count;
//};
//动态版
typedef struct contact
{
//指向动态申请的空间,用来存放联系人的信息
Peoinfo* data;
//记录当前通讯录中有效信息的个数
int count;
//记录当前通讯录的最大容量
int capacity;
}contact;
enum option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
PRINT,
INIT
};
//声明控制间距
void distance();
//声明初始化通讯录
void INITcontact(contact* pc);
//声明增加信息
void ADDcontact(contact* pc);
//声明删除指定联系人
void DELcontact(contact* pc);
//声明查找指定人名字
int FINDBYname(const contact* pc, const char name[]);
//声明查找指定人的信息
void SEARCHcontact(const contact* pc);
//声明打印所有通讯录信息
void PRINTcontact(const contact* pc);
//声明修改指定人的信息
void MODIFYcontact(contact* pc);
//实现按照名字排序通讯录的信息
void SORTcontact(const contact* pc);
//销毁通讯录
void DESTORYcontact(contact* pc);
//保存通讯录
void SAVEcontact(const contact* pc);
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//实现控制间距
void distance()
{
printf("\n\n\n");
}
//实现增加信息(静态版)
//void ADDcontact(contact *pc)
//{
// assert(pc);
// if (pc->count == MAX)
// {
// printf("通讯录已满,添加失败\n");
// return;
// }
// printf("请输入联系人的名字:");
// scanf("%s", pc->data[pc->count].name);
// printf("请输入年龄:");
// scanf("%d", &(pc->data[pc->count].age));
// printf("请输入性别:");
// scanf("%s", pc->data[pc->count].sex);
// printf("请输入电话:");
// scanf("%s", pc->data[pc->count].tele);
// printf("请输入地址:");
// scanf("%s", pc->data[pc->count].addr);
// pc->count++;
// printf("添加成功\n");
// distance();
//}
//增容
void LINcontact(contact* pc)
{
assert(pc);
if (pc->count == pc->capacity)
{
Peoinfo* ptr = realloc(pc->data, (pc->capacity + SZ_MAX) * sizeof(Peoinfo));
if (!ptr)
{
perror("ADDcontact");
printf("增容失败\n");
return;
}
else
{
pc->data = ptr;
pc->capacity += SZ_MAX;
printf("增容成功\n");
}
}
}
//实现增加信息(动态版)
void ADDcontact(contact* pc)
{
assert(pc);
//空间已满,考虑增容
LINcontact(pc);
printf("请输入联系人的名字:");
scanf("%s", pc->data[pc->count].name);
printf("请输入年龄:");
scanf("%d", &(pc->data[pc->count].age));
printf("请输入性别:");
scanf("%s", pc->data[pc->count].sex);
printf("请输入电话:");
scanf("%s", pc->data[pc->count].tele);
printf("请输入地址:");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf("添加成功\n");
distance();
}
//实现初始化通讯录(静态版)
//void INITcontact(contact *pc)
//{
// assert(pc);
// memset(pc->data,0,sizeof(pc->data));
// pc->count = 0;
//}
//实现初始化通讯录(动态版)
//void INITcontact(contact* pc)
//{
// assert(pc);
// pc->data = (Peoinfo*)malloc(DEEAULT_MAX * sizeof(Peoinfo));
// if (!(pc->data))
// {
// perror("Initcotact");
// return;
// }
// pc->count = 0;
// pc->capacity = DEEAULT_MAX;
//}
void LOADcontact(contact* pc)
{
assert(pc);
//打开文件
FILE* pf = fopen("contact.lin", "rb");
if (!pf)
{
perror("LOADcontact");
return;
}
//读取文件
Peoinfo tmp = { 0 };
while (fread(&tmp, sizeof(Peoinfo),1, pf))
{
LINcontact(pc);
pc->data[pc->count++] = tmp;
}
//关闭文件
fclose(pf);
pf = NULL;
}
//初始化通讯录(文件版)
void INITcontact(contact* pc)
{
assert(pc);
pc->data = (Peoinfo*)malloc(DEEAULT_MAX * sizeof(Peoinfo));
if (!(pc->data))
{
perror("Initcotact");
return;
}
pc->count = 0;
pc->capacity = DEEAULT_MAX;
memset(pc->data, 0, pc->capacity*sizeof(pc->data));
//信息存放至文件中
LOADcontact(pc);
}
//实现打印所有通讯录信息
void PRINTcontact(const contact* pc)
{
assert(pc);
printf("%-20s %-20s %-20s %-20s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i < pc->count; i++)
{
printf("%-20s %-20d %-20s %-20s %-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
//实现查找指定名字
int FINDBYname(const contact* pc,const char name[])
{
assert(pc);
for (int i = 0; i < pc ->count; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//实现删除指定联系人
void DELcontact(contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
char name[NAME_MAX] = { 0 };
printf("请输入删除人的名字:");
scanf("%s", name);
//查找名字
int pos=FINDBYname(pc, name);
if (pos == -1)
{
printf("要删除的信息不存在\n");
return;
}
else
{
for (int j = pos; j < pc->count-1 ; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->count--;
printf("删除成功");
}
}
//实现查找指定人的信息
void SEARCHcontact(const contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
printf("请输入查找人的名字:");
scanf("%s", name);
distance();
//查找名字
int pos = FINDBYname(pc, name);
if (pos == -1)
{
printf("要查找的信息不存在\n");
return;
}
printf("%-20s %-20s %-20s %-20s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s %-20d %-20s %-20s %-20s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
//实现修改指定人的信息
void MODIFYcontact(contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
printf("请输入修改人的名字:");
scanf("%s", name);
distance();
//查找名字
int pos = FINDBYname(pc, name);
if (pos == -1)
{
printf("要修改的信息不存在\n");
return;
}
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");
distance();
}
//实现按照名字排序通讯录的信息
void SORTcontact(const contact* pc)
{
assert(pc);
if (pc->count ==0)
{
printf("通讯录中没有联系人,排序失败\n");
return;
}
for (int i = 0; i < pc->count-1; i++)
{
for (int j = 0; j < pc->count - 1; j++)
{
if (strcmp(pc->data[j].name, pc->data[j + 1].name)>0)
{
Peoinfo tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}
//销毁通讯录
void DESTORYcontact(contact* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
pc->count = 0;
pc->capacity = 0;
}
//保存通讯录
void SAVEcontact(const contact* pc)
{
FILE*pf=fopen("contact.lin", "wb");
if (!pf)
{
perror("SAVEcontact");
return;
}
for (int i = 0; i < pc->count; i++)
{
fwrite(pc->data + i, sizeof(Peoinfo), 1, pf);
}
fclose(pf);
}
tast.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
//控制间距
distance();
printf(" 0.exit 1.add\n");
printf(" 2.del 3.search\n");
printf(" 4.modify 5.sort\n");
printf("