contact.h
#ifndef _CONTACT_H__
#define _CONTACT_H__
#include<stdio.h>
#include <stdlib.h>
#define INC 2 //每次开辟的内存大小
#define SZ 3 //默认大小
#define MAX 1000
#define NAME 10
#define SEX 5
#define TELE 20
#define ADDR 30
typedef struct PerInfo{ //个人信息结构体
char name[NAME];
int age;
char sex[SEX];
char tele[TELE];
char addr[ADDR];
}PerInfo;
typedef struct Contact{ //通讯录信息结构体
PerInfo contact[MAX];
PerInfo *contact;
int sz;
int capacity;
}Contact, *pContact;
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
#include "contact.h"
void InitContact(pContact pcon){
pcon->sz = 0;
pcon->contact = (PerInfo *)malloc(SZ*sizeof(PerInfo));
if (NULL == pcon->contact){
perror("InitContact :: malloc");
exit(EXIT_FAILURE);
}
memset(pcon->contact, 0, SZ *sizeof(pcon->contact));
pcon->capacity = SZ;
}
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){
PerInfo *tmp = realloc(pcon->contact,(pcon->capacity + DEFAULT_INC) * sizeof(PeoInfo));
if (tmp != NULL){
pcon->contact = tmp;
pcon->capacity += INC;
printf("增容成功!\n");
return 1;
}
else
return 0;
}
return 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[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
#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);
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;
}