我们利用realloc动态内存开辟来实现通讯录,这样就可以存储无数个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
1.增加联系人
2.删除联系人
3.修改联系人
4.查找联系人
5.显示联系人
6.排序联系人
7.清空联系人
8.以文件保存
思路分析:
Contact.h头文件
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include
#include
#include
#include
#include
#include
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 11
#define DEFAULT_SZ 1
#define DEFAULT_INC 1
enum
{
EXIT,
ADD,
DEL,
MODIFY,
SEARCH,
SHOW,
SORT,
EMPTY,
SAVE,
};
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[MAX];
PeoInfo *data; //动态内存开辟
int sz;
int capacity; //用来维护动态内存开辟的容量
}Contact,*pContact;
void InitContact(pContact p);
void AddContact(pContact p);
void DelContact(pContact p);
void ModifyContact(pContact p);
void SearchContact(pContact p);
void EmptyContact(pContact p);
void DestroyContact(pContact p);
//void SortInfo(pContact p);
void Sort_Name(pContact p);
void LoadContact(pContact p);
void SaveContact(pContact p);
void ShowContact(const pContact p);
static int Find(pContact p);
#endif //__CONTACT_H__
test.c测试文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
printf("*********************************\n");
printf("***** CONTACT *****\n");
printf("***** 1.ADD 2.DEL *****\n");
printf("***** 3.MODIFY 4.SEARCH *****\n");
printf("***** 5.SHOW 6.SORT *****\n");
printf("***** 7.EMPTY 0.Exit *****\n");
printf("***** 8.Save *****\n");
}
void test()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf("请选择>>>");
scanf("%d",&input);
if (input<0 && input>9)
{
printf("1234\n");
perror("选择错误");
}
else
{
switch (input)
{
case EXIT:
DestroyContact(&con);
return;
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
Sort_Name(&con);
break;
case EMPTY:
EmptyContact(&con);
break;
case SAVE:
SaveContact(&con);
}
}
} while (1);
}
int main()
{
test();
return 0;
}
contact.c主要函数实现
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
int check_capacity(pContact p)
{
if (p->sz == p->capacity)
{
PeoInfo*tmp = realloc(p->data,(p->capacity+DEFAULT_INC)*sizeof(PeoInfo));
if (tmp != NULL)
{
p->data = tmp;
p->capacity += DEFAULT_INC;
// printf("增容成功\n");
}
else
{
return 1;
}
}
return 0;
}
void LoadContact(pContact p)
{
FILE *pf = fopen("contact.dat","rb");
PeoInfo tmp = {0};
if (pf == NULL)
{
perror("open contact fail");
exit(EXIT_FAILURE);
}
while (fread(&tmp,sizeof(PeoInfo),1,pf))
{
check_capacity(p);
p->data[p->sz++] = tmp;
}
fclose(pf);
pf = NULL;
}
void InitContact(pContact p)
{
assert(p != NULL);
p->data = (PeoInfo*)malloc(DEFAULT_SZ*sizeof(PeoInfo));
if (p->data == NULL)
{
//printf("%s\n",strerror(errno));
perror("InitContact:malloc");
exit(EXIT);
}
memset(p->data,0,DEFAULT_SZ*sizeof(PeoInfo));
p->sz = 0;
p->capacity = DEFAULT_SZ;
LoadContact(p);
}
void AddContact(pContact p)
{
if(check_capacity(p))
{
return ;
}
printf("请输入姓名>>>");
scanf("%s",p->data[p->sz].name);
printf("请输入年龄>>>");
scanf("%d",&(p->data[p->sz].age));
printf("请输入性别>>>");
scanf("%s",p->data[p->sz].sex);
printf("请输入地址>>>");
scanf("%s",p->data[p->sz].addr);
printf("请输入电话>>>");
scanf("%s",p->data[p->sz].tele);
p->sz++;
printf("添加成功\n");
}
static int FindEntry(char* c,pContact p)
{
int i = 0;
for (i=0;isz;i++)
{
if (strcmp(c,p->data[i].name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(pContact p)
{
char name[NAME_MAX];
int ret = 0;
printf("请输入删除人的姓名>>>");
scanf("%s",name);
ret = FindEntry(name,p);
if (ret == -1)
{
printf("要删除的人不存在\n");
}
else
{
int i = 0;
for (i=ret;isz-1;i++)
{
p->data[i] = p->data[i+1];
}
p->sz--;
printf("删除成功\n");
}
}
void ModifyContact(pContact p)
{
int ret = 0;
char name[NAME_MAX];
printf("请输入修改人的姓名>>>");
scanf("%s",name);
ret = FindEntry(name,p);
if (ret == -1)
{
printf("要修改的人不存在\n");
}
else
{
printf("\n\t\tContact\n");
printf("%5s\t%s\t%2s\t%5s\t%5s\t\n",
"name","age","sex","addr","tele");
printf("%5s\t%d\t%3s\t%5s\t%5s\t\n",
p->data[ret].name,
p->data[ret].age,
p->data[ret].sex,
p->data[ret].addr,
p->data[ret].tele);
printf("请输入修改后的姓名>>>");
scanf("%s",p->data[ret].name);
printf("请输入修改后的年龄>>>");
scanf("%d",&(p->data[ret].age));
printf("请输入修改后的性别>>>");
scanf("%s",p->data[ret].sex);
printf("请输入修改后的地址>>>");
scanf("%s",p->data[ret].addr);
printf("请输入修改后的电话>>>");
scanf("%s",p->data[ret].tele);
printf("修改成功\n");
}
}
void SearchContact(pContact p)
{
int ret = 0;
char name[NAME_MAX];
printf("请输入查找人的姓名>>>");
scanf("%s",name);
ret = FindEntry(name,p);
if (ret == -1)
{
printf("没有该联系人\n");
}
else
{
printf("\n\t\tContact\n");
printf("%5s\t%s\t%2s\t%5s\t%5s\t\n",
"name","age","sex","addr","tele");
printf("%5s\t%d\t%3s\t%5s\t%5s\t\n",
p->data[ret].name,
p->data[ret].age,
p->data[ret].sex,
p->data[ret].addr,
p->data[ret].tele);
}
}
void ShowContact(const pContact p)
{
int i = 0;
//int ret = 0;
//for (i=0;isz;i++)
//{
// if (p->data[0].name == NULL)
// {
// ret = 1;
// }
//}
//if(ret == 1)
//{
// printf("没有任何联系人");
//}
//else
//{
printf("\n\t\tContact\n");
printf("%5s\t%s\t%2s\t%5s\t%5s\t\n",
"name","age","sex","addr","tele");
for (i=0;isz;i++)
{
printf("%5s\t%d\t%3s\t%5s\t%5s\t\n",
p->data[i].name,
p->data[i].age,
p->data[i].sex,
p->data[i].addr,
p->data[i].tele);
}
//}
}
void EmptyContact(pContact p)
{
int i = 0;
if (p->sz == 0)
{
printf("没有联系人\n");
}
else
{
free(p->data);
p->sz = 0;
p->capacity = 0;
p->data = NULL;
printf("清空成功\n");
}
}
//void SortContact(char* c,pContact p)
//{
// int i ,j = 0;
// PeoInfo tmp ;
// for (i=0;isz;i++)
// {
// for (j=0;jsz;j++)
// {
// if (p->data[j].age < p->data[j+1].age)
// {
// tmp = p->data[j];
// p->data[j] = p->data[j+1];
// p->data[j+1] = tmp;
// }
// }
// }
//}
//
void Sort_Name(pContact p) //以名字排序所有联系人
{
int i = 0;
int j = 0;
int flag = 0;
printf("以名字进行排序(a-->z)\n");
while(1)
{
flag = 0;
for (j = 0; j < p->sz - 1; j++)
{
if (strcmp(p->data[j].name, p->data[j + 1].name)>0)
{
PeoInfo tmp = p->data[j];
p->data[j] = p->data[j + 1];
p->data[j + 1] = tmp;
flag = 1;
}
}
if (flag == 0)
break;
}
}
void SaveContact(pContact p)
{
FILE *pf = fopen("contact.dat","w");
int i = 0;
if (pf == NULL)
{
perror("open contact fail");
exit(EXIT_FAILURE);
}
for (i=0;isz;i++)
{
fwrite(&(p->data[i]),sizeof(PeoInfo),1,pf);
}
printf("Save success\n");
fclose(pf);
pf = NULL;
}
void DestroyContact(pContact p)
{
free(p->data);
p->capacity = 0;
p->data = NULL;
p->sz = 0;
}
程序到这就结束了,演示部分小编就不在这里放了,需要的话请自行测试