contact.h

#define _CRT_SECURE_NO_WARNINGS 1
//#define MAX 50

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

struct Perinfor
{
	char name[10];
	unsigned short age;
	char sex[5];
	char address[20];
	char tel[12];
};
struct Book
{
	struct Perinfor *collect ;
	int capacity;
	int size  ;
};
enum Option
{
	Exit,
	New,
	Delete,
	Modify,
	Find,
	Show,
	Save
};

//打印菜单
void menu();
//初始化通讯录
void InitialBook(struct Book *p);
//销毁通讯录
void Destroy(struct Book *p);
//打印通讯录
void ShowBooks(const struct Book *p);
//功能实现
//新建
void NewConstrcution(struct Book *p);
//删除
void DeleteBook(struct Book *p);
//修改
void ModifyBook(struct Book *p);
//查找
void FindBook(const struct Book *p);
//保存
void SaveBooks(struct Book *p);

contact.c

#include "contact.h"

void menu()
{
	printf("\t1 新建\t2 删除\n");
	printf("\t3 修改\t4 查找\n");
	printf("\t5 查看全部\t6 保存\n");
	printf("\t0 退出\n");
	printf("请选择:>");
}
//初始化
void InitBooks(struct Book *p)
{
	FILE *pf = fopen("Book.dat", "rb");
	struct Perinfor *ret;
	int lodnum = 2;
	ret = (struct Perinfor*)calloc(lodnum, sizeof(struct Perinfor));
	if (ret == NULL)
	{
		strerror("InitBooks: :%s", ret);
		return;
	}
	else
	{
		p->collect = ret;
		p->size = 0;
		p->capacity = lodnum;
	}
	if (pf != NULL)
	{
		struct Perinfor tmp = { 0 };
		while (fread(&tmp, sizeof(struct Perinfor), 1, pf))
		{
			Congest(p);
			p->collect[p->size] = tmp;
			p->size++;
		}
		fclose(pf);
		pf = NULL;
	}
}
//扩充动态内存空间
int Congest(struct Book *p)
{
	//满了增容
	if (p->size == p->capacity)
	{
		struct Perinfor *ret;
		ret = (struct Perinfor*)realloc(p->collect, 2 * sizeof(struct Perinfor));
		if (ret == NULL)
		{
			strerror("Congest: :%s\n", ret);
			return;
		}
		else
		{
			p->collect = ret;
			printf("增容成功\n");
			p->capacity += 2;
			return 1;
		}
	}
	//没满返回1
	return 1;
}
void Destroy(struct Book *p)
{
	free(p->collect);
	p->collect = NULL;
}
//新建
void NewConstrcution(struct Book *p)
{
	int ret = 0;
	ret = Congest(p);
	if (ret)
	{
		printf("新建\\姓名:>");
		scanf("%s", p->collect[p->size].name);
		printf("新建\\年龄:>");
		scanf("%d", &(p->collect[p->size].age));
		printf("新建\\性别:>");
		scanf("%s", p->collect[p->size].sex);
		printf("新建\\电话:>");
		scanf("%s", p->collect[p->size].tel);
		printf("新建\\地址:>");
		scanf("%s", p->collect[p->size].address);

		p->size++;
		printf("创建成功\n");
	}
}
//打印
void ShowBooks(const struct Book *p)
{
	printf("%-10s\t%-3s\t%-5s\t%-12s\t%s\n",
		"姓名", "年龄", "性别", "电话", "地址");
	if (p->size > 0)
	{
		int i = 0;
		for (i = 0; i < p->size; i++)
		{
			printf("%-10s\t%-3d\t%-5s\t%-12s\t%s\n",
				p->collect[i].name,
				p->collect[i].age,
				p->collect[i].sex,
				p->collect[i].tel,
				p->collect[i].address);
		}
	}
	printf("\n");
}
//
int cy(struct Book *p, char name[10])
{
	int i = 0;
	for (i = 0; i < p->size; i++)
	{
		if (0 == (strcmp(p->collect[i].name, name)))
		{
			break;
		}
	}
	return i;
}
//删除
void DeleteBook(struct Book *p)
{
	char name[10];
	int ret = 0;
	printf("删除\\姓名:>");
	scanf("%s", &name);
	ret = cy(p, name);
	if (ret != p->size)
	{
		int i = 0;
		for (i = 0; i < p->size; i++)
		{
			p->collect[i] = p->collect[i + 1];
		}
		p->size--;
		printf("删除成功\n");
	}
	else
	{
		printf("删除失败,未找到 ' %s '\n", name);
	}
}
//修改
void ModifyBook(struct Book *p)
{
	int ret = 0;
	char name[10];
	printf("修改\\姓名:>");
	scanf("%s", &name);
	ret = cy(p, name);
	if (ret != p->size)
	{
		char tmp[20] = { 0 };
		printf("输入 ' / ' 跳过本项修改\n");
		printf("修改后\\姓名:>");
		scanf("%s", &tmp);
		if (memcmp(tmp, "/", 1))
			strcpy(p->collect[ret].name, tmp);
		printf("修改后\\年龄:>");
		scanf("%s", &tmp);
		if (memcmp(tmp, "/", 1))
			p->collect[ret].age = atoi(tmp);
		printf("修改后\\性别:>");
		scanf("%s", &tmp);
		if (memcmp(tmp, "/", 1))
			strcpy(p->collect[ret].sex, tmp);
		printf("修改后\\电话:>");
		scanf("%s", &tmp);
		if (memcmp(tmp, "/", 1))
			strcpy(p->collect[ret].tel, tmp);
		printf("修改后\\地址:>");
		scanf("%s", &tmp);
		if (memcmp(tmp, "/", 1))
			strcpy(p->collect[ret].address, tmp);

		printf("修改成功\n");
	}
	else
	{
		printf("修改失败,未找到 ' %s '\n", name);
	}
}
//查找
void FindBook(const struct Book *p)
{
	char name[10];
	int ret = 0;
	int i = 0;
	printf("查找\\姓名:>");
	scanf("%s", &name);
	printf("%-10s\t%-3s\t%-5s\t%-12s\t%s\n",
		"姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < p->size; i++)
	{
		if (NULL != (strstr(p->collect[i].name, &name)))
		{
			printf("%-10s\t%-3d\t%-5s\t%-12s\t%s\n",
				p->collect[i].name,
				p->collect[i].age,
				p->collect[i].sex,
				p->collect[i].tel,
				p->collect[i].address);
		}
	}
}
//保存到本地磁盘
void SaveBooks(struct Book *p)
{
	FILE *pf = fopen("Book.dat", "wb");
	if (pf == NULL)
	{
		strerror("SaveBook: :%s", pf);
		return;
	}
	else
	{
		int i = 0;
		if (p->size)
		{
			for (i = 0; i < p->size; i++)
			{
				fwrite(&(p->collect[i]), sizeof(struct Perinfor), 1, pf);
			}
			printf("保存成功\n");
			fclose(pf);
			pf = NULL;
		}
	}
}

text.c

#include "contact.h"

int main()
{
	int input = 0;
	//创建通讯录
	struct Book con ;
	//初始化通讯录
	InitBooks(&con);
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case New:
			NewConstrcution(&con);
			break;
		case Delete:
			DeleteBook(&con);
			break;
		case Modify:
			ModifyBook(&con);
			break;
		case Find:
			FindBook(&con);
			break;
		case Show:
			ShowBooks(&con);
			break;
		case Save:
			SaveBooks(&con);
			break;
		case Exit:
			SaveBooks(&con);
			Destroy(&con);
			break;
		default:
			printf("输入有误,请重新输入");
			break;
		}
	} while (input);
	return 0;
}