contact.h
#ifndef _CONTACT_H__
#define _CONTACT_H__
# include<stdio.h>
# include <stdlib.h>
#define DEFAULT_INC 2 //每次开辟的内存大小
#define DEFAULT_SZ 3 //默认大小
#define MAX 1000
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_TELE 20
#define MAX_ADDR 30
typedef struct PeoInfo//个人信息结构体
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
typedef struct Contact//通讯录信息结构体
{
//PeoInfo contact[MAX];//MAX是最多可添加的信息量,每条信息为PeoInfo
PeoInfo *contact;//数据存放的位置
int sz;//用于记录添加的信息量,有效个数,即现在存放的个数
int capacity;
}Contact, *pContact;//通讯录Contact的新名字
//接口
void InitContact(pContact pcon);
void AddContact (pContact pcon);
void ShowContact(const pContact pcon);
void DelContact(pContact pcon);
int CheckCapacity(pContact pcon);
#endif //_CONTACT_H__
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
# include "contact.h"
void InitContact(pContact pcon)
{
pcon->sz = 0;
pcon->contact = (PeoInfo *)malloc(DEFAULT_SZ*sizeof(PeoInfo));
if (NULL == pcon->contact)//检查动态分配内存是否成功
{
perror("InitContact :: malloc");//???
exit(EXIT_FAILURE);//????????
}
memset(pcon->contact, 0, DEFAULT_SZ *sizeof(pcon->contact));
pcon->capacity = DEFAULT_SZ;//初始化最大容量为DEFAULT_SZ(3)
}
void DestoryContact(pContact pcon)
{
free(pcon->contact);
pcon->contact = NULL;
pcon->sz = 0;
pcon->capacity = 0;
}
int CheckCapacity(pContact pcon)
{
if (pcon->sz == pcon->capacity)
{
PeoInfo *tmp = realloc(pcon->contact,
(pcon->capacity + DEFAULT_INC) * sizeof(PeoInfo));
if (tmp != NULL)
{
pcon->contact = tmp;
pcon->capacity += DEFAULT_INC;
printf("增容成功!\n");
return 1;
}
else
return 0;
}
return 1;//如果不增容是也返回1
}
void AddContact(pContact pcon)
{
//if (pcon->sz == MAX)
//{
// printf("通讯录已满!");
// return;//不返回什么值吗?为何还要返回?
//}
if (CheckCapacity(pcon) == 0)
{
return;
}
printf("请输入名字:>");
scanf("%s", pcon->contact[pcon->sz].name);
printf("请输入年龄:>");
scanf("%d", &(pcon->contact[pcon->sz].age)); //注意加&
printf("请输入性别:>");
scanf("%s", pcon->contact[pcon->sz].sex);
printf("请输入电话:>");
scanf("%s", pcon->contact[pcon->sz].tele);
printf("请输入地址:>");
scanf("%s", pcon->contact[pcon->sz].addr);
pcon->sz++;
printf("添加成功!\n");//有一个反馈信息会更好
}
void ShowContact(const pContact pcon)
{
int i = 0;
printf("%12s\t%4s\t%5s\t%12s\t%12s\n", "name", "age", "sex", "tele", "addr");
for (i = 0; i < pcon->sz; i++)
{
printf("%12s\t%4d\t%5s\t%12s\t%12s\n",
pcon->contact[i].name,
pcon->contact[i].age,
pcon->contact[i].sex,
pcon->contact[i].tele,
pcon->contact[i].addr);
}
}
static int FindEntry(pContact pcon, char name[])
{
int i = 0;
for (i = 0; i < pcon->sz; i++)
{
if (strcmp(name, pcon->contact[i].name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(pContact pcon)
{
int pos = 0;
char name[MAX_NAME] = { 0 };
if (pcon->sz == 0)
{
printf("通讯录已空\n");
return;
}
printf("请输入您想要删除的记录\n");
scanf("%s", &name);
pos = FindEntry(pcon, name);
if (pos == -1)
{
printf("您想要删除的记录不存在!\n");
}
else
{
memmove(pcon->contact + pos,
pcon->contact + pos + 1,
(pcon->sz - pos - 1)*sizeof(PeoInfo));
pcon->sz--;
printf("删除成功!\n");
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
# include "contact.h"
enum Op
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
EMPTY,
SORT
};
void menu()
{
printf("*******************************************\n");
printf("******* 1、add 2、 del *********\n");
printf("******* 3、search 4、 modify *********\n");
printf("******* 5、show 6、 empty *********\n");
printf("******* 7、sort 0、 exit *********\n");
printf("*******************************************\n");
}
test()
{
int input = 0;
Contact my_con;//将添加的信息和信息量封装后创建的一个变量,即新创建的一个通讯录名
InitContact(&my_con);//想传结构体就传其地址
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&my_con);
break;
case DEL:
DelContact(&my_con);
break;
case SEARCH:
break;
case MODIFY:
break;
case SHOW:
ShowContact(&my_con);
break;
case EMPTY:
break;
case SORT:
break;
case EXIT:
DestoryContact(&my_con);
break;
default:
printf("选择错误,请重新输入!");
break;
}
} while (input);
}
int main()
{
test();
system("pause");
return 0;
}