头文件
contact.c
#ifndef _CONOTACT_H_
#define _CONOTACT_H_
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#define MAX_NAME 20
#define MAX_TEL 11
#define MAX_ADDR 11
#define MAX_SEX 5
#define MAX_NUMBER 1000
#define DEFAULT_SIZE 5
enum option
{
ADD = 1,
SEARCH,
DEL,
SHOW,
CLEAR,
SORT,
CHANGE,
DESTROY,
SAVE,
LOAD,
EXIT=0
}cont;
//个人信息
typedef struct person_info
{
char name[MAX_NAME];
short age;
int tele[MAX_TEL];
char addr[MAX_ADDR];
char sex[MAX_SEX];
}personinfo;
typedef struct contact
{
//personinfo per[MAX_NUMBER];
//int usedsize; //被使用的个数
personinfo *per;
int usedsize; //被使用的个数
int capticty; //容量
}contact;
void ADDContact(contact* pcon);
void Initcontact(contact* pcon);
int Searchcontact(contact* pcon);
void Delcontact(contact* pcon);
void Showcontact(contact* pcon);
void Clearcontact(contact* pcon);
void Sortcontact(contact* pcon);
void Changecontact(contact* pcon);
void Destroycontact(contact* pcon);
void Loadcontact(contact *pcon);
void Savecontact(contact *pcon);
#endif // _CONOTACT_H_
contact.c
#include"contact.h"
//初始化结构体数组
void Initcontact(contact* pcon)
{
assert(pcon != NULL);
//memset(pcon->per, 0, sizeof(pcon->per));
//pcon-> usedsize = 0 ;
pcon->capticty = DEFAULT_SIZE;
pcon->usedsize = 0;
pcon->per = (personinfo*)malloc(sizeof(personinfo)*pcon->capticty);
assert(pcon->per != NULL);
memset(pcon->per, 0, sizeof(personinfo)*pcon->capticty);
Loadcontact(pcon);
}
//加载联系人
void Loadcontact(contact *pcon)
{
int i = 0;
personinfo con ;
FILE *pf = fopen("program.txt","rb");
if (pf == NULL)
{
printf("can not open file\n");
return;
}
//while (fread(pcon->per+i, sizeof(personinfo),
// 1, pf))
//{
// i++;
//}
//pcon->usedsize = i;
while (fread(&con, sizeof(personinfo),
1, pf)>0)
{
checkfull(pcon);
pcon->per[pcon->usedsize++] = con;
}
fclose(pf);
pf = NULL;
}
//1.添加联系人到通讯录里
static int checkfull(contact* pcon)
{
personinfo *ptr;
assert(pcon != NULL);
if (pcon->usedsize == pcon->capticty)
{
personinfo *ptr = (personinfo*)realloc
(pcon->per,sizeof(personinfo)*pcon->capticty*2);
if (ptr != NULL)
{
pcon->per = ptr;
pcon->capticty *= 2;
printf("增容成功!\n");
return 1;
}
else
{
return 0;
}
}
return 1;
}
void ADDContact(contact* pcon)
{
int ret = checkfull(pcon);
assert(pcon != NULL);
if (ret == 0)
{
printf("增容失败!\n");
}
//1.往哪里放 ,数组,下标
//2.姓名,年龄
//if (pcon->usedsize == MAX_NUMBER)
//{
// printf("添加满了\n");
// return;
//}
printf("请输入姓名:");
scanf("%s", pcon->per[pcon->usedsize].name);
printf("请输入年龄:");
scanf("%d", &(pcon->per[pcon->usedsize].age));
printf("请输入电话号码:");
scanf("%s", pcon->per[pcon->usedsize].tele);
printf("请输入性别:");
scanf("%s", pcon->per[pcon->usedsize].sex);
printf("请输入地址:");
scanf("%s", pcon->per[pcon->usedsize].addr);
pcon->usedsize++;
printf("添加成功!\n");
}
// 2.根据姓名查找指定联系人信息
int Searchcontact(contact* pcon)
{
char name[5];
int i = 0;
assert(pcon != NULL);
if (pcon->usedsize == 0)
{
printf("通讯录为空\n");
return -1;
}
printf("输入姓名\n");
scanf("%s", name);
for (i = 0; i < pcon->usedsize; i++)
{
if (strcmp(pcon->per[i].name
, name) == 0)
{
printf("%-10s%-10s%-10s%-10s%-10s\n",
"姓名", "年龄", "电话号码", "性别", "地址");
printf("%-10s%-10d%-10s%-10s%-10s\n",
pcon->per[i].name,
pcon->per[i].age,
pcon->per[i].tele,
pcon->per[i].sex,
pcon->per[i].addr
);
return i;
}
}
}
//3.删除指定联系人信息
void Delcontact(contact* pcon)
{
int i = 0;
assert(pcon != NULL);
i = Searchcontact(pcon);
if (i == -1)
{
printf("查无此人!\n");
return;
}
for (i = Searchcontact(pcon);
i < pcon->usedsize-1; i++)
{
pcon->per[i] = pcon->per[i+1];
}
pcon->usedsize --;
printf("删除成功!\n");
}
// 4.显示所有联系人
void Showcontact(contact* pcon)
{
int i = 0;
assert(pcon != NULL);
printf("%-10s%-10s%-10s%-10s%-10s\n",
"姓名", "性别", "电话号码","年龄","地址" );
for (i = 0; i < pcon->usedsize; i++)
{
printf("%-10s%-10s%-10s%-10d%-10s\n",
pcon->per[i].name,
pcon->per[i].sex,
pcon->per[i].tele,
pcon->per[i].age,
pcon->per[i].addr
);
}
}
//5.清空所有联系人
void Clearcontact(contact* pcon)
{
assert(pcon != NULL);
pcon->usedsize = 0;
}
//6.以名字排序所有联系人
void Sortcontact(contact* pcon)
{
int i = 0;
int j = 0;
int flag = 1;
assert(pcon != NULL);
personinfo per;
for (i = 0; i < pcon->usedsize-1; i++)
{
flag = 1;
for (j = 0; j<pcon->usedsize - 1 - i; j++)
{
if (strcmp(pcon->per[j].name
, pcon->per[j + 1].name) > 0)
{
flag = 0;
per = pcon->per[j];
pcon->per[j] = pcon->per[j + 1];
pcon->per[j + 1] = per;
}
}
if (flag == 1)
break;
}
}
// 7.修改指定联系人
void Changecontact(contact* pcon)
{
int i = 0;
char name[10];
assert(pcon != NULL);
printf("输入姓名\n");
scanf("%s", name);
for (i = 0; i < pcon->usedsize; i++)
{
if (strcmp(pcon->per[i].name
, name) == 0)
{
printf("请输入修改的年龄:");
scanf("%d", &(pcon->per[i].age));
printf("请输入修改的电话号码:");
scanf("%s", pcon->per[i].tele);
printf("请输入修改的性别:");
scanf("%s", pcon->per[i].sex);
printf("请输入修改的地址:");
scanf("%s", pcon->per[i].addr);
printf("修改成功!\n");
break;
}
}
for (i = 0; i < pcon->usedsize; i++)
{
if (strcmp(pcon->per[i].name
, name) != 0)
{
printf("无此人!\n");
break ;
}
}
}
//8.摧毁指定联系人
void Destroycontact(contact* pcon)
{
assert(pcon != NULL);
Savecontact(pcon);
free(pcon->per);
pcon->per = NULL;
pcon->capticty = 0;
pcon->usedsize = 0;
}
//保存联系人到文件 fwirte()
void Savecontact(contact *pcon)
{
int i = 0;
assert(pcon != NULL);
FILE *pw = fopen("program.txt", "wb");
/*if (pw == NULL)
{
printf("未保存成功!\n");
return;
}*/
for (i = 0; i < pcon->usedsize; i++)
{
fwrite(pcon->per + i, sizeof(personinfo),
1, pw);
}
fclose(pw);
pw = NULL;
}
test.c
#include"contact.h"
void menu()
{
printf("*******************************\n");
printf("**** 1.添加联系人信息 ****\n");
printf("**** 2.查找指定联系人信息 ****\n");
printf("**** 3.删除指定联系人信息 ****\n");
printf("**** 4.显示所有联系人信息 ****\n");
printf("**** 5.清空所有联系人 ****\n");
printf("**** 6.以名字排序所有联系人****\n");
printf("**** 7.修改指定联系人 ****\n");
printf("**** 8.摧毁指定联系人 ****\n");
printf("**** 9.保存联系人到文件 ****\n");
printf("**** 10.加载联系人信息 ****\n");
printf("**** 0.退出 ****\n");
printf("*******************************\n");
}
void start()
{
int input = 0;
//初始化通讯录 数组 usedsize
contact pcon;
Initcontact(&pcon);
do
{
menu();
printf("请输入操作->>\n");
scanf("%d",&input);
switch (input)
{
case ADD:
ADDContact(&pcon);
break;
case SEARCH:
Searchcontact(&pcon);
break;
case DEL:
Delcontact(&pcon);
break;
case SHOW:
Showcontact(&pcon);
break;
case CLEAR:
Clearcontact(&pcon);
break;
case SORT:
Sortcontact(&pcon);
break;
case CHANGE:
Changecontact(&pcon);
break;
case DESTROY:
Destroycontact(&pcon);
break;
case SAVE:
Savecontact(&pcon);
break;
case LOAD:
Loadcontact(&pcon);
break;
default:
printf("请正确输入选项!\n");
}
} while (input);
}
int main()
{
start();
}