//contact.h文件
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
//#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
#define CONTACT_ADD 2
#define CONTACT_MAX 3
#define FILE_NAME "contact.dat"
typedef struct PeoInfo //定义一个通讯录结构体
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char addr[ADDR_MAX];
char tele[TELE_MAX];
}PeoInfo;
typedef struct Contact //维护通讯录的结构体
{
PeoInfo *data;
int sz; //通讯录的上限
int capacity; //每次增容的个数
}Contact, *pContact;
static CheckCapacity(pContact pcon);
void InitContact(pContact pcon);
void AddContact(pContact pcon);
void ShowContact(const pContact pcon);
void DelContact(pContact pcon);
void SearchContact(pContact pcon);
void ModifyContact(pContact pcon);
void SortContach(pContact pcon);
void ClearContact(pContact pcon);
void SaveContactData(pContact pcon);
void LoadContactData(pContact pcon);
#endif
//contact.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void InitContact(pContact pcon) //增容函数
{
int i = 0;
pcon->data = malloc(CONTACT_MAX*sizeof(PeoInfo));
if (pcon->data == NULL)
{
printf("error malloc:\n");
exit(EXIT_FAILURE);
}
pcon->sz = 0;
for (i=0;i<pcon->sz;i++)
{
memset(&(pcon->data[i]),0,sizeof(pcon->data[i]));
}
pcon->capacity = CONTACT_MAX;
LoadContactData(pcon);
}
static CheckCapacity(pContact pcon)
{
if (pcon->sz == pcon->capacity)
{
PeoInfo* ptr = realloc(pcon->data,(pcon->capacity+CONTACT_ADD)*sizeof(PeoInfo));
if (ptr == NULL)
{
printf("error realloc:\n");
exit(EXIT_FAILURE);
}
else
{
pcon->data = ptr;
pcon->capacity = pcon->capacity+CONTACT_ADD;
printf("realloc success\n");
}
}
}
void AddContact(pContact pcon)
{
CheckCapacity(pcon);
printf("name:");
scanf("%s",pcon->data[pcon->sz].name);
printf("sex:");
scanf("%s",pcon->data[pcon->sz].sex);
printf("addr:");
scanf("%s",pcon->data[pcon->sz].addr);
printf("age:");
scanf("%d",&pcon->data[pcon->sz].age);
printf("tele:");
scanf("%s",pcon->data[pcon->sz].tele);
printf("添加成功!!!\n");
(pcon->sz)++;
}
void _Add(pContact pcon,PeoInfo *tmp)
{
CheckCapacity(pcon);
pcon->data[pcon->sz] = *tmp;
pcon->sz++;
}
void LoadContactData(pContact pcon)
{
FILE* pf = fopen(FILE_NAME, "r");
PeoInfo tmp = {0};
while(fread(&tmp, sizeof(PeoInfo), 1, pf))
{
_Add(pcon, &tmp);
}
}
void SaveContactData(pContact pcon)
{
int i = 0;
FILE *fp = fopen(FILE_NAME,"w");
if ((fp == NULL))
{
perror("Open file error!\n");
exit(EXIT_FAILURE);
}
for (i=0;i<pcon->sz;i++)
{
fwrite(pcon->data+i, sizeof(PeoInfo), 1, fp);
}
fclose(fp);
}
void ShowContact(const pContact pcon)
{
int i = 0;
for (i=0;i<pcon->sz;i++)
{
printf("name:%s\n",pcon->data[i].name);
printf("sex:%s\n",pcon->data[i].sex);
printf("age:%d\n",pcon->data[i].age);
printf("addr:%s\n",pcon->data[i].addr);
printf("tele:%s\n",pcon->data[i].tele);
}
}
void ModifyContact(pContact pcon)
{
int i = 0;
char name[20] = { 0 };
printf("请输入要修改的姓名:");
scanf("%s",name);
for (i=0;i<=pcon->sz;i++)
{
if (strcmp(name, pcon->data[i].name) == 0)
{
printf("name:");
scanf("%s", pcon->data[i].name);
printf("sex:");
scanf("%s", pcon->data[i].sex);
printf("age:");
scanf("%d", &pcon->data[i].age);
printf("addr:");
scanf("%s", pcon->data[i].addr);
printf("tele:");
scanf("%s", pcon->data[i].tele);
printf("修改成功!\n");
break;
}
}
}
void DelContact(pContact pcon)
{
char name1[20] = { 0 };
int i = 0;
int j = 0;
printf("请输入要删除的姓名:");
scanf("%s",name1);
for (i=0;i<pcon->sz;i++)
{
if (strcmp(pcon->data[i].name,name1)==0)
{
for (j = i; j<pcon->sz; j++)
{
pcon->data[j] = pcon->data[j + 1];
}
pcon->sz--;
printf("删除成功!!!");
break;
}
else
{
printf("没有此联系人!!\n");
break;
}
}
}
void SearchContact(pContact pcon)
{
int i = 0;
char name[20] = { 0 };
printf("请输入要查找的姓名:");
scanf("%s",name);
for (i=0;i<pcon->sz;i++)
{
if (strcmp(name, pcon->data[i].name) == 0)
{
printf("%s\n", pcon->data[i].name);
printf("%s\n", pcon->data[i].sex);
printf("%s\n", pcon->data[i].addr);
printf("%s\n", pcon->data[i].tele);
printf("%d\n", pcon->data[i].age);
break;
}
else
{
printf("没有找见!\n");
break;
}
}
}
void SortContach(pContact pcon)
{
int i = 0;
int j = 0;
char name[5] = {0};
for (i=0;i<pcon->sz-1;i++)
{
for (j=i;j<pcon->sz-i-1;j++)
{
if(strcmp(pcon->data[j].name,pcon->data[j+1].name)>0)
{
PeoInfo tmp = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tmp;
}
}
}
printf("排序成功!!!");
}
void ClearContact(pContact pcon)
{
int i = 0;
pcon->sz = 0;
for (i=0;i<pcon->sz;i++)
{
memset(&(pcon->data[i]),0,sizeof(pcon->data[i]));
}
printf("清除成功!!!\n");
}
//test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
printf("***************************************************************\n");
printf("******* 1.add 2.show **********\n");
printf("******* 3.delete 4.search **********\n");
printf("******* 5.modify 6.sort **********\n");
printf("******* 7.clear 0.exit **********\n");
printf("***************************************************************\n");
}
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf("输入序号:");
scanf("%d",&input);
switch (input)
{
case 1:
AddContact(&con);
break;
case 2:
ShowContact(&con);
break;
case 3:
DelContact(&con);
break;
case 4:
SearchContact(&con);
break;
case 5:
ModifyContact(&con);
break;
case 6:
SortContach(&con);
break;
case 7:
ClearContact(&con);
break;
default:
SaveContactData(&con);
exit(EXIT_SUCCESS);
}
} while (1);
return 0;
}