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;
}